繁体   English   中英

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

[英]How to allow a console program to accept data from a callback function

我想我是对的,如果我有这样的程序可以设置回调函数,那是对的。

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

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

仅以示例为例:
消息队列上的主线程块(或定期检查是否相同),等待读取消息,然后在回调函数中将消息发布到此消息队列。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM