【发布时间】:2017-07-06 05:02:13
【问题描述】:
我正在尝试执行具有稳定循环时间(例如 20 毫秒)的方法。我目前的方法是使用std::thread 创建一个线程。在这个线程中,我执行以下操作(伪代码):
while(true)
{
tStart = GetCurrentTime();
ExecuteMethod();
tEnd = GetCurrentTime();
actualCycleTime = tEnd - tStart;
SleepFor(DesiredCycleTime - actualCycleTime);
}
对于时间测量和睡眠,我使用std::chrono(std::steady_clock 和std::thread::sleep_for)。
问题是我的循环没有以预期的稳定 20 毫秒运行。相反,我的循环时间在 20 到 60 毫秒之间。我的猜测是这是由 Windows 调度程序引起的。
有没有更好的方法来实现稳定的周期时间(忙等待等)?
【问题讨论】:
-
您正在使用重复的相对计时,这在确定实际循环时间和设置所需循环时间之间容易受到竞争条件的影响。您需要对所需循环时间进行外部控制的周期性触发器。
-
timeSetEvent 在与 timeBeginPeriod 一起使用时非常可靠。 MSDN 说它已经过时了,你应该使用 msdn.microsoft.com/en-us/library/ms682485(v=vs.85).aspx 我没有任何经验,所以我不能说它有多可靠或精确。
-
改用
sleep_until,例如:stackoverflow.com/a/44418375/576911