![](/img/trans.png)
[英]How do I allow my program to accept different inputs from the user in C++?
[英]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.