2013-04-15 66 views
0

我正在編寫一個應用程序,將輸入從一個設備轉換爲另一個設備 - 說一個頭部跟蹤格式到另一個,主要用於支持遊戲中多種類型的頭部跟蹤。Windows毫秒計時 - 沒有busywait?

大多數情況下,我的程序輸入是通過輪詢共享內存來提供的。然而,在一個緊密的循環中這樣做會不必要地消耗一個CPU內核。該應用程序不會降低遊戲體驗勢在必行。

在Windows上的默認計劃時間似乎是60赫茲,所以睡眠差不多了。我需要少於5毫秒,但偶爾的點是好的。

我寧願不影響系統配置通過影響系統範圍計時器。

什麼是我的選擇,以防止消耗核心,但仍主要執行一些方法每1毫秒左右一次,使用C或.net?

我要尋找的解決方案爲Windows 7

+0

中斷並沒有幫助你......?只是有點好奇... –

+0

@HirenPandya幫助我如何?我沒有設備爲我生成中斷,因爲它們(輸入設備)使用共享內存? – Max

+0

'我的程序的輸入是通過輪詢共享內存來傳遞的,關於這一行,我有點困惑,我的意思是,只要輸入在任何輸入設備的共享內存中可用,就不能中斷程序。我仍然對你的問題有些困惑,所以放置一些愚蠢但清除點.. –

回答

-1

如果進程間同步是出了問題,嘗試使用SetTimer功能。它可以以毫秒爲間隔調用您的回調。

如果你想要一個毫秒級的睡眠,你可以使用WaitForSingleObject。只要給它一些不會改變自己狀態的事件句柄。

但是,所有這些選項都是相當不可靠的,因爲Windows不會給你時間保證,而且如果系統過載,結果將不會很好。

+0

-1。您[SetTimer()']不能超過10 ms(http://msdn.microsoft.com /en-us/library/windows/desktop/ms644906%28v=vs.85%29.aspx)。OP需要1到5毫秒。 –

+0

@AlexeyFrunze我相信這取決於使用的操作系統。例如,Windows 8 RT可能會獲得所需的結果。但通常我同意:在Windows上,確保所需的響應時間非常困難(幾乎不可能)。 –

2

看起來你只有兩種選擇:

  1. 使用Multimedia Timers,但你似乎不喜歡這個想法。
  2. 在所有長循環中都會調用函數調用,在那裏檢查TSCPerformance Counter,並在時間正確時執行需要執行的任何操作。
+0

我大約10年前在一個項目上使用了多媒體定時器,其中1ms超時而不影響系統範圍的定時器。 – Neil

+0

@Neil據我瞭解,如果有多媒體定時器的另一個用戶,兩者之間可能會有一些干擾。 –

+0

謝謝。我會重新評估mm計時器,但是我最後一次嘗試,以及如果我記得正確的話,msdn文檔說他們需要使用beginsettime來實現ms計時器。你知道win32格式或wpf如何實現低延遲,而不消耗整個cpu嗎? – Max