0

我有线程安全回调的问题。

void draw_something() { /* draws something */ }

问题是,如何draw_something在每个指定的时间段内调用主应用程序线程,而不考虑其他代码(因此它会像 C# Timer 和主线程中的触发函数一样)?早些时候,我使用 CreateWindow 创建(在主线程中)辅助窗口,该窗口处理来自 SendMessage 的消息(从另一个计时器线程发送):

void MainThreadFunction(){
    CreateThread(0, NULL, GoProc, NULL, NULL, NULL);
}

DWORD WINAPI GoProc(LPVOID lpParam){
    while(1){
        SendMessage(auxiliary_window_hWnd, ADDINATIONAL_MESSAGE, 0, 0);
        Sleep(30);
    }
    return 0;
}

因此,window 的 MessageQueue 处理安全线程调用,但我认为这不是一种非常有效和优雅的方式。我知道有更好的方法(也许是提升?)但我不知道。

4

2 回答 2

5

您可以使用 WindowsSetTimer调用来获取定期WM_TIMER消息并完全跳过第二个线程。

于 2012-04-13T22:21:41.427 回答
0

您不能只是神奇地“中断”正在运行的线程并“注入”您自己的代码,而不是在用户空间中。

如果您没有特别严格的时间要求,您已经拥有的解决方案(本质上是一种消息传递形式)很好。

如果时间对您重要,即您必须保证事件(在您的情况下经过时间)和处理该事件之间有一定的延迟,您必须在“检测到”事件的线程中进行处理或维护准备好唤醒并立即进行处理的工作线程池。但我猜draw_something()必须在 UI 线程上完成,所以这个解决方案可能已经过时了。

于 2012-04-13T22:54:58.597 回答