允许每隔X毫秒运行一次

时间:2016-11-25 10:29:14

标签: c++ windows delay

我正试图让我的while循环每10毫秒运行一次。 while内部的代码非常简单,因此不需要花费大量时间来运行。除了在结束时使用Sleep()函数之外还有其他方法吗?更准确的东西?

我正在使用Visual Studio。

5 个答案:

答案 0 :(得分: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); } } 。这将自动考虑循环中其他代码所花费的时间(无论多么微不足道):

Account Chooser

答案 1 :(得分:0)

我想说,这应该足够准确。如果您希望代码每10毫秒运行一次,那么您必须测量代码的执行长度,然后为10ms - <length of execution in ms>执行休眠。

为了以最佳精度进行测量,您可以使用high_resolution_clock,它至少以system_clock速率运行,或者更好。 http://www.cplusplus.com/reference/chrono/high_resolution_clock/

答案 2 :(得分:0)

在Windows上,您可以使用SetTimer

然而,这可能会使事情过于复杂 - 特别是如果您的回调需要访问类。你应该看看std::this_thread::sleep_for

array = [1,2,3,4,6,8,9]
min, max = array.minmax
missing = (min..max).to_a - array
#=> [5,7]

答案 3 :(得分:0)

如果你确实需要每10毫秒运行一次,那么最好等待旋转循环。伪代码:

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

答案 4 :(得分:0)

SleepWaitable Timers都在幕后使用线程,因此分辨率是默认时间片的顺序,即10-20ms。如果您需要更高的分辨率,您应该查看多媒体计时器。 The documentation承诺优于1毫秒的分辨率。正如其他人所说,手上的SetTimer / WM_TIMER接口似乎具有15.6ms的固定分辨率。

另一个高分辨率计时接口是Performance Counter,但似乎你只能查询它们,而不是等待任何事情,所以你会有空闲的等待循环(旋转)。

相关问题