我认为我认为如果我有一个这样的程序来设置回调函数我是对的。
void MyCallbackFunction(char* data) {
cout << "some data arrived: " << data << endl;
}
int main(){
//sets up callback
SetDispatchFunction(&MyCallbackFunction));
while(1==1) {
sleep(1000);
}
return 0;
}
那么因为这是一个单线程程序并且执行总是处理while循环,所以程序无法处理MyCallbackFunction处理程序?
如果是这样,假设我不想使用多个线程,我有什么选择来允许处理回调函数?
我决定用一个真实的例子来证明。
#include <iostream>
using namespace std;
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
char szText[100] = {0};
GetWindowText(hwndChild, szText, 100);
if (lstrlen(szText) < 1) return true;
cout << "Window text: " << szText << endl;
return TRUE;
}
int main(int argc, char* argv[])
{
//latch onto Google Chrome if running
HWND windowHandle = FindWindow("Chrome_WidgetWin_0", 0);
if(windowHandle)
EnumChildWindows(windowHandle, EnumChildProc, 0);
//loop so program doesn't stop
while(1==1) {
Sleep(2000);
}
return 0;
}
答案 0 :(得分:1)
回调函数通常在您注册的实体生成的线程中被调用,您将需要某种信号机制,通过该机制,您可以使主线程知道回调。始终建议不在线程中执行处理,而应该切换上下文并在其自己的线程中执行处理。
仅作为例子考虑:
消息队列上的主线程块(或定期检查相同),等待读取消息,并在回调函数中向此消息队列发送消息。
您还可以使用受同步保护的全局来实现类似的功能而无需消息队列。
但是,如果您的程序是严格单线程的,那么在某个时间点while
循环将被中断并且回调函数将被执行,其中您可以设置一个全局变量,然后可以检查当它被中断的时候。当然,需要同步。