2016-11-25 51 views
0

我試圖讓我的while循環每10毫秒運行一次。這段時間內的代碼非常簡單,所以不需要很長時間才能運行。除了在最後使用Sleep()函數之外還有其他方法嗎?更準確的東西?允許一段時間運行每X毫秒

我正在使用Visual Studio。

+0

爲什麼10ms?默認的Windows定時器分辨率是15.6毫秒。你爲什麼需要更多?你是否想要控制動畫?這是*不是*處理多媒體的正確方法 –

回答

0

我會說,這應該是足夠準確的。如果您希望代碼每10ms精確運行一次,則必須測量代碼的執行時間,然後爲10ms - <length of execution in ms>執行Sleep。

對於以最高精度進行測量,您可以使用high_resolution_clock,它至少以system_clock速率運行,或更好。 http://www.cplusplus.com/reference/chrono/high_resolution_clock/

0

在Windows上,您可以使用SetTimer

但是,這可能是過於複雜的事情 - 尤其是如果您的回調需要訪問類。你應該看看std::this_thread::sleep_for

std::this_thread::sleep_for(std::chrono::milliseconds(10)); 
+2

睡眠不能保證每10秒鐘執行一次。 Windows定時器的默認精度爲15.6ms,即使如此,線程切換可能會導致延遲 –

+0

好點,我不知道默認的精度 - 你碰巧有一個鏈接,我可以讀到這個? – pierobot

0

,如果你確實需要精確地運行它每隔10毫秒,在自旋循環更好的期待。僞代碼:

while (your_condition) 
{ 
    var t = curTime; 
    do_what_you_need; 
    while (curTime - t < 10); 
} 
2

而不是std::this_thread::sleep_for,最好使用sleep_until這種類型的延遲。多久循環內的其他代碼正在(但輕微或沒有)這將自動考慮:

#include <chrono> 
#include <iostream> 
#include <thread> 

int 
main() 
{ 
    using namespace std::chrono; 
    auto next = steady_clock::now(); 
    while (true) 
    { 
     std::cout << "hi\n"; 
     next += 10ms; 
     std::this_thread::sleep_until(next); 
    } 
} 
0

兩個SleepWaitable Timers使用線程在幕後,所以分辨率是默認的順序時間片,這是10-20ms。如果你需要更高的分辨率,你應該看看多媒體定時器。 The documentation承諾優於1ms分辨率。正如其他人所說,手上的接口似乎具有15.6ms的固定分辨率。

另一個高分辨率的定時接口是Performance Counter,但它似乎只能查詢它們,而不是等待任何東西,所以你會有空閒的等待循環(旋轉)與他們。