C ++ Timer,Thread,定期调用

时间:2012-04-13 22:16:05

标签: c++ multithreading winapi timer

我遇到线程安全回调问题。

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

问题是,如何在主应用程序线程中调用draw_something每个指定的时间量而不考虑其他代码(因此它将像主线程中的C#Timer和fire函数一样)?之前我使用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会处理safethread调用,但我不认为它是否是非常有效和优雅的方法。我知道有更好的方法(也许是提升?)但我不知道。

2 个答案:

答案 0 :(得分:5)

您可以使用Windows SetTimer调用获取定期WM_TIMER消息,并完全跳过第二个帖子。

答案 1 :(得分:0)

你不能神奇地"打断"正在运行的线程和"注入"你自己的代码,而不是用户空间。

如果您没有特别严格的时间要求,那么您已经拥有的解决方案(基本上是message passing的形式)很好。

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