#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; }