zoukankan      html  css  js  c++  java
  • C++ 回调函数 Callback 机制例程

    #include <iostream>
    
    #include <thread>
    #include <mutex>
    
    #include <Windows.h>
    
    
    // callback test
    
    
    
    /////////////////////////////////////////////////////////////
    
    // API part
    typedef void(__stdcall *CallbackEvent)(const char* pStr, bool bOK, void * any);
    
    
    /////////////////////////////////////////////////////////////
    
    // API part
    class API
    {
    public:
    	API() = delete;
    	API(CallbackEvent pCallBack, const char* pStr, bool bOK, void * any=nullptr)
    		:
    		mpStr	  (pStr	  )	  ,
    		mbOK	  (bOK	  )	  ,
    		mpCallBack(pCallBack) ,
    		mAny	  (any)
    	{
    		mThread = std::make_unique<std::thread>(&API::run, this);
    		mThread->detach();
    	}
    
    	~API(){};
    
    	void run()
    	{
    		int i = 0;
    		while (true)
    		{
    			Sleep(50);
    
    			if (i % 10 == 0)
    			{
    				// start callback event
    				//auto str = std::to_string(i);
    				mpCallBack(mpStr, mbOK, mAny);
    			}
    
    			std::cout << "i = " << i << std::endl;
    			++i;
    
    			if (i == 200)
    			{
    				break;
    			}
    
    		}
    	}
    private:
    	std::unique_ptr<std::thread> mThread    ;
    	CallbackEvent	mpCallBack;
    
    	// parameter of callback function.
    	const char*		mpStr		;
    	bool			mbOK		;
    	void *			mAny		;
    };
    
    
    /////////////////////////////////////////////////////////////
    
    typedef struct passToCallbackFun
    {
    	passToCallbackFun(int w, int h) 
    		: 
    		width (w),
    		height(h)
    	{}
    	int width ;
    	int height;
    } ImgSize;
    
    // user definition
    void __stdcall onCallback(const char* pStr, bool ok,  void * any)
    {
    	std::cout << "doing: " << pStr << ", ok = " << ok << std::endl;
    
    	if (any == nullptr) return;
    
    	ImgSize* iSize = (ImgSize*)any;
    	std::cout << "size: w=" << iSize->width << ", h= " << iSize->height << std::endl;
    }
    
    /////////////////////////////////////////////////////////////
    
    int main()
    {
    	// register callback event
    	std::string str("adc");
    	ImgSize isize(10, 20);
    	API api(onCallback, str.c_str(), true, &isize);
    
    	// hold main thread
    	int i = 0;
    	while (true)
    	{
    		Sleep(50);
    
    		if (i % 10 == 0)
    		{
    			// do something
    		}
    
    		//std::cout << "i = " << i << std::endl;
    		++i;
    
    		if (i == 200)
    		{
    			break;
    		}
    
    	}
    
    	return 0;
    
    }
    

      

  • 相关阅读:
    Windows SDK 之 mciSendString最后一个参数
    java常用包下载地址(非maven)
    windows api(GDI)实现图片旋转
    windows sdk版本 之 并查集生成迷宫
    自签https证书2(适配新版chrome,不会显示“不安全”)
    数据结构——栈(Stacks)
    数据结构——表(list)
    数据结构——链表(linkedlist)
    解题报告1010 诡秘的余数
    函数体中用指针返回数组的方法
  • 原文地址:https://www.cnblogs.com/alexYuin/p/11928200.html
Copyright © 2011-2022 走看看