如何允许控制台程序接受来自回调函数的数据

时间:2011-10-27 16:15:29

标签: c++ console

我认为我认为如果我有一个这样的程序来设置回调函数我是对的。

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

1 个答案:

答案 0 :(得分:1)

回调函数通常在您注册的实体生成的线程中被调用,您将需要某种信号机制,通过该机制,您可以使主线程知道回调。始终建议不在线程中执行处理,而应该切换上下文并在其自己的线程中执行处理。

仅作为例子考虑:
消息队列上的主线程块(或定期检查相同),等待读取消息,并在回调函数中向此消息队列发送消息。

您还可以使用受同步保护的全局来实现类似的功能而无需消息队列。

但是,如果您的程序是严格单线程的,那么在某个时间点while循环将被中断并且回调函数将被执行,其中您可以设置一个全局变量,然后可以检查当它被中断的时候。当然,需要同步。