1. #include <iostream>
  2.  
  3. #include <thread>
  4. #include <mutex>
  5.  
  6. #include <Windows.h>
  7.  
  8. // callback test
  9.  
  10. /////////////////////////////////////////////////////////////
  11.  
  12. // API part
  13. typedef void(__stdcall *CallbackEvent)(const char* pStr, bool bOK, void * any);
  14.  
  15. /////////////////////////////////////////////////////////////
  16.  
  17. // API part
  18. class API
  19. {
  20. public:
  21. API() = delete;
  22. API(CallbackEvent pCallBack, const char* pStr, bool bOK, void * any=nullptr)
  23. :
  24. mpStr (pStr ) ,
  25. mbOK (bOK ) ,
  26. mpCallBack(pCallBack) ,
  27. mAny (any)
  28. {
  29. mThread = std::make_unique<std::thread>(&API::run, this);
  30. mThread->detach();
  31. }
  32.  
  33. ~API(){};
  34.  
  35. void run()
  36. {
  37. int i = 0;
  38. while (true)
  39. {
  40. Sleep(50);
  41.  
  42. if (i % 10 == 0)
  43. {
  44. // start callback event
  45. //auto str = std::to_string(i);
  46. mpCallBack(mpStr, mbOK, mAny);
  47. }
  48.  
  49. std::cout << "i = " << i << std::endl;
  50. ++i;
  51.  
  52. if (i == 200)
  53. {
  54. break;
  55. }
  56.  
  57. }
  58. }
  59. private:
  60. std::unique_ptr<std::thread> mThread ;
  61. CallbackEvent mpCallBack;
  62.  
  63. // parameter of callback function.
  64. const char* mpStr ;
  65. bool mbOK ;
  66. void * mAny ;
  67. };
  68.  
  69. /////////////////////////////////////////////////////////////
  70.  
  71. typedef struct passToCallbackFun
  72. {
  73. passToCallbackFun(int w, int h)
  74. :
  75. width (w),
  76. height(h)
  77. {}
  78. int width ;
  79. int height;
  80. } ImgSize;
  81.  
  82. // user definition
  83. void __stdcall onCallback(const char* pStr, bool ok, void * any)
  84. {
  85. std::cout << "doing: " << pStr << ", ok = " << ok << std::endl;
  86.  
  87. if (any == nullptr) return;
  88.  
  89. ImgSize* iSize = (ImgSize*)any;
  90. std::cout << "size: w=" << iSize->width << ", h= " << iSize->height << std::endl;
  91. }
  92.  
  93. /////////////////////////////////////////////////////////////
  94.  
  95. int main()
  96. {
  97. // register callback event
  98. std::string str("adc");
  99. ImgSize isize(10, 20);
  100. API api(onCallback, str.c_str(), true, &isize);
  101.  
  102. // hold main thread
  103. int i = 0;
  104. while (true)
  105. {
  106. Sleep(50);
  107.  
  108. if (i % 10 == 0)
  109. {
  110. // do something
  111. }
  112.  
  113. //std::cout << "i = " << i << std::endl;
  114. ++i;
  115.  
  116. if (i == 200)
  117. {
  118. break;
  119. }
  120.  
  121. }
  122.  
  123. return 0;
  124.  
  125. }

  

C++ 回调函数 Callback 机制例程的更多相关文章

  1. java基础-回调函数(callback)

    java基础-回调函数(callback) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数 ...

  2. JavaScript系列之回调函数callback

    JavaScript系列之回调函数callback JavaScript回调函数的使用是很常见的,引用官方回调函数的定义: A callback is a function that is passe ...

  3. js回调函数(callback)理解

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

  4. JS回调函数(callback)

    在使用Jquery的时候,用到Callback(),回调函数的概念.而且很多. 比如: $.ajax({ url:"test.json", type: "GET" ...

  5. 理解javascript中的回调函数(callback)

    以下内容来源于:http://www.jb51.net/article/54641.htm 最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs ...

  6. 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

  7. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  8. C++回调函数(callback)的使用

    什么是回调函数(callback)    模块A有一个函数foo,他向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事 ...

  9. 回调函数callback使用例子

    代码如下: <!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <tit ...

随机推荐

  1. go语言设计模式之interpreter

    interpreter.go package interpreter import ( //"fmt" "strconv" "strings" ...

  2. css 知识点,你有可能不知道欧!

    1.[定位特性] 绝对定位和固定定位,同时设置left和right等同于隐式的设置宽度. <style> span{ position:fixed; left:30px; right:30 ...

  3. xml模块(了解)

    目录 一.xml简介 二.Python使用xml 三.自己创建xml文档 一.xml简介 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在 ...

  4. IT兄弟连 Java语法教程 数组 数组的初始化

    Java语言中数组必须先初始化,然后才可以使用.所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋初始值. 这时有人会问,能不能只分配内存空间,不赋初始值呢?答案是肯定不行的,一旦为数组 ...

  5. 序列化禁止使用Optional

    1: 概论 Optional 是Java8用来改变java引发NPE的解决办法,但是不是绝对的解决办法 2: 例子: 很多博文一上来就给力以下使用例子 @Data public class User ...

  6. jemalloc内存占用问题

    最近,有部分越南的服务器内存不断上涨,怀疑是内存泄漏,因为框架提供的内存报告里,C内存和Lua占用内存都不大,和ps里看的差好多.总内存在12G左右,C和Lua的加起来约4G,两者相差了8G 经过一番 ...

  7. 为了“小命”,这款APP一定要下!火爆了!

    前言中国地震台网在 6 月 17 日测定:6 月 17 日 22 时 55 分,四川省宜宾市长宁县发生 6 级地震,震源深度 16 千米.成都高新减灾研究所通过电台广播.手机短信.电视等途径,提前 6 ...

  8. 黄聪:Mysql开启InnoDB引擎出现1067错误的解决办法

    在my.ini文件添加下面这行: innodb_force_recovery = 1 可以解决:InnoDB: Attempted to open a previously opened tables ...

  9. 计科菜鸟玩生信(一)——Windows10下用docker安装GATK

    1.官网下载GATK. (学校网速实在是太慢了,下载几个小时到自闭) 下载地址:https://software.broadinstitute.org/gatk/download/ 下载完成后文件夹中 ...

  10. 最好用的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署。

     #基于webpack构建的 Koa2 restful API 服务器脚手架    这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6, 支持使用TypeSc ...