2016-11-25 54 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,但它似乎只能查询它们,而不是等待任何东西,所以你会有空闲的等待循环(旋转)与他们。