允许每x ms运行一段时间

Allowing a while to run every X ms

本文关键字:运行 一段时间 ms 许每      更新时间:2023-10-16

我正在尝试使每10毫秒的循环运行一次。内部的代码非常简单,因此运行不需要大量时间。除了在末尾使用Sleep()功能之外,还有其他方法吗?更准确的东西?

我正在使用Visual Studio。

而不是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 << "hin";
        next += 10ms;
        std::this_thread::sleep_until(next);
    }
}

在Windows上您可以使用Settimer。

但是,这可能会过度复杂化 - 特别是如果您的回调需要访问课程。您应该检查std :: this_thread :: sleep_for

std::this_thread::sleep_for(std::chrono::milliseconds(10));

如果您确实需要每10毫秒准确地运行一次,则最好在旋转循环中等待。伪代码:

while (your_condition)
{
    var t = curTime;
    do_what_you_need;
    while (curTime - t < 10);
}

我会说,这应该足够准确。如果要使代码完全运行一次,则必须测量代码的执行时间,然后对10ms - <length of execution in ms>睡觉。

以最佳的精度测量您可以使用High_resolution_Clock,至少以System_Clock速率运行或更高。http://www.cplusplus.com/reference/chrono/high_resolution_clock/

Sleep和wareable计时器都在幕后使用螺纹,因此分辨率按默认时间切片的顺序,即10-20ms。如果您需要更高的分辨率,则应研究多媒体计时器。该文档有望比1MS分辨率更好。正如其他人所说的,手上的SetTimer/WM_TIMER接口似乎具有15.6ms的固定分辨率。

另一个高分辨率正时接口是性能计数器,但似乎您只能查询它们,不要等待任何东西,因此您会与它们进行空闲的等待循环(旋转)。