2012-04-13 89 views
0

我有線程安全回調的問題。C++定時器,線程,定期調用

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

,問題是,如何調用draw_something在主應用程序線程每隔指定的時間,不論其他代碼(所以它會像C#定時器並在主線程火功能)?早些時候,我使用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; 
} 

所以窗口的MessageQueue交易safethread電話,但我不認爲如果它是非常有效和優雅的方式來做到這一點。我知道有更好的方法(也許提升?),但我不知道。

回答

5

您可以使用Windows SetTimer調用獲取定期的WM_TIMER消息並完全跳過第二個線程。

+0

+1這也將防止OP代碼所具有的時鐘偏移。它將總是有超過30ms的間隔。 – usr 2012-04-13 22:31:03

+0

計時器也可能受到歪斜。這個用例看起來不太可能是個問題。 – 2012-04-13 22:37:26

0

你不能神奇地「中斷」正在運行的線程,並「注入」自己的代碼,而不是在用戶空間中。

如果您沒有特別嚴格的時間要求,您已經擁有的解決方案基本上是message passing的一種形式。

如果時間重要的是你,也就是說你必須保證事件的(在你的案件的時間通道)和處理事件之間存在一定的延遲,你就必須做在線程的處理是「檢測「這個事件或者保持一個工作線程池準備好喚醒並且立刻通知處理。但我猜draw_something()必須在UI線程上完成,所以這個解決方案可能不存在。

+0

Windows不太適合硬延遲要求。 – 2012-04-13 23:00:12