2012-12-16 28 views
4

我正在寫一個事件處理函數,f(d),接收一些數據,d,並且必須採取採取行動X(d),然後睡超過100ms,然後採取其他操作Y(d)。我將執行它爲:單次定時器在C++的WinCE

void f(d) 
{ 
    X(d); 
    Sleep(100); 
    Y(d); 
} 

然而,f(d)從單線程事件處理程序調用,所以睡眠(100)是不可接受的。

我想做到以下幾點:

void f(d) 
{ 
    X(d); 
    ScheduleOneShotTimer(Y,d,100); 
} 

我可以通過爲每個調用一個新的線程,傳遞數據作爲參數的線程和執行Y(d)之前調用Sleep實施ScheduleOneShotTimer。但是,由於此事件可能每秒發生多達100次,因此我擔心創建銷燬所有這些線程的開銷。

最好有一個「一次性計時器」的操作系統級支持,但我不認爲這是CE的情況。我知道SetTimer,但這不適用於我,因爲我正在編寫一個沒有消息循環的「控制檯應用程序」。

任何其他建議如何構造這將不勝感激。

回答

0

我會創建一個線程,保持一個隊列的時間戳回調對,休眠100毫秒(或更小的東西),然後執行所有已用的回調。具有所有線程間同步的OFC(關鍵部分上的互鎖等)。

這是一個注重性能的解決方案,而不是一個以精度爲導向的解決方案。隨着回調堆積,可能需要比完全100毫秒的執行更長的時間。但是因爲你用Wait來測量時間(這並不準確),所以我想它可能已經足夠好了。

6

調用timeSetEvent API(我知道一個完全不直觀的API名稱)。使用回調函數和TIME_ONESHOT參數。

+0

謝謝。偉大的小API。但事實證明,我所需要的只是批量處理X個電話,然後睡眠100ms,然後以批量方式執行Ys。 (另外,我關心timeSetEvent API的資源開銷:它是否爲每個事件創建新線程?如果不是,它如何處理這些事件中的阻塞或睡眠?我希望有更多文檔可用。) –

+0

它被驅動通過定時器中斷。我相信每個回調都會產生一個單獨的線程,儘管它很容易測試。 – ctacke