我需要实现一个准确一致的延迟或睡眠功能,并且必须能够被取消。
这是我的代码:
bool cancel_flag(false);
void My_Sleep(unsigned int duration)
{
static const size_t SLEEP_INTERVAL = 10U; // 10 milliseconds
while ((!cancel_flag) && (duration > SLEEP_INTERVAL))
{
Sleep(duration);
duration -= SLEEP_INTERVAL;
}
if ((!cancel_flag) && (duration > 0U))
{
Sleep(duration);
}
}
上述函数在工作线程中运行。主线程能够更改“cancel_flag”的值以中止(取消)睡眠。
在我的商店,当持续时间为 10 秒(10000 毫秒)时,我们会得到不同的结果。一些电脑显示 10 秒的睡眠持续时间,其他电脑显示 16 秒。
关于 Sleep() 函数的文章说它绑定到窗口中断,并且当持续时间过去时,线程被重新调度(可能不会立即运行)。由于重新调度和中断延迟,上述函数可能会遇到时间错误传播。
Windows 时间戳项目描述了另一种等待计时器对象的技术。我的理解是,这种技术不提供取消的方法(通过另一个主线程)。
问题:
1.如何改进线程延迟或睡眠的实现,可以被另一个任务取消,并且更一致?
可以终止休眠的 AFX 线程吗?
(当主线程终止休眠的 AFX 线程时会发生什么?)当主线程终止调用 WaitForSingleObject 的线程时会发生什么?
精度应该在 10ms 左右,如 10 秒 + 10ms。
结果应该在各种 PC(所有运行 Windows 7 或 10)之间保持一致。
具有正确计时的后台
PC 运行 Windows 7,频率为 2.9 GHz。
计时不正确的 PC 运行的是 3.1 GHz 的 Windows 7,同时运行的任务和应用程序较少。
应用程序是使用 Visual Studio 2017 和 MFC 框架(使用 AFX 进行线程创建)开发的。