我试图让我的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毫秒。你为什么需要更多?你是否想要控制动画?这是*不是*处理多媒体的正确方法 –