我正试图让我的while循环每10毫秒运行一次。 while内部的代码非常简单,因此不需要花费大量时间来运行。除了在结束时使用Sleep()
函数之外还有其他方法吗?更准确的东西?
我正在使用Visual Studio。
答案 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)
Sleep
和Waitable Timers都在幕后使用线程,因此分辨率是默认时间片的顺序,即10-20ms。如果您需要更高的分辨率,您应该查看多媒体计时器。 The documentation承诺优于1毫秒的分辨率。正如其他人所说,手上的SetTimer
/ WM_TIMER
接口似乎具有15.6ms的固定分辨率。
另一个高分辨率计时接口是Performance Counter,但似乎你只能查询它们,而不是等待任何事情,所以你会有空闲的等待循环(旋转)。