我試圖讓我的while循環每10毫秒運行一次。這段時間內的代碼非常簡單,所以不需要很長時間才能運行。除了在最後使用Sleep()
函數之外還有其他方法嗎?更準確的東西?允許一段時間運行每X毫秒
我正在使用Visual Studio。
我試圖讓我的while循環每10毫秒運行一次。這段時間內的代碼非常簡單,所以不需要很長時間才能運行。除了在最後使用Sleep()
函數之外還有其他方法嗎?更準確的東西?允許一段時間運行每X毫秒
我正在使用Visual Studio。
我會說,這應該是足夠準確的。如果您希望代碼每10ms精確運行一次,則必須測量代碼的執行時間,然後爲10ms - <length of execution in ms>
執行Sleep。
對於以最高精度進行測量,您可以使用high_resolution_clock,它至少以system_clock速率運行,或更好。 http://www.cplusplus.com/reference/chrono/high_resolution_clock/
在Windows上,您可以使用SetTimer。
但是,這可能是過於複雜的事情 - 尤其是如果您的回調需要訪問類。你應該看看std::this_thread::sleep_for
std::this_thread::sleep_for(std::chrono::milliseconds(10));
睡眠不能保證每10秒鐘執行一次。 Windows定時器的默認精度爲15.6ms,即使如此,線程切換可能會導致延遲 –
好點,我不知道默認的精度 - 你碰巧有一個鏈接,我可以讀到這個? – pierobot
,如果你確實需要精確地運行它每隔10毫秒,在自旋循環更好的期待。僞代碼:
while (your_condition)
{
var t = curTime;
do_what_you_need;
while (curTime - t < 10);
}
而不是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);
}
}
兩個Sleep
和Waitable Timers使用線程在幕後,所以分辨率是默認的順序時間片,這是10-20ms。如果你需要更高的分辨率,你應該看看多媒體定時器。 The documentation承諾優於1ms分辨率。正如其他人所說,手上的接口似乎具有15.6ms的固定分辨率。
另一個高分辨率的定時接口是Performance Counter,但它似乎只能查詢它們,而不是等待任何東西,所以你會有空閒的等待循環(旋轉)與他們。
爲什麼10ms?默認的Windows定時器分辨率是15.6毫秒。你爲什麼需要更多?你是否想要控制動畫?這是*不是*處理多媒體的正確方法 –