使用Windows和c++的chrono为每个人安排一个1毫秒的事件——我是不是要求太多了?

Scheduling an event for everyone 1ms using Windows and C++ chrono - am I asking for too much?

本文关键字:事件 1毫 是不是 太多 一个 chrono c++ Windows 每个人 使用      更新时间:2023-10-16

我有一些像这样的代码:

    while(true)  
    {
    std::chrono::milliseconds NowSinceEpoch = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
    if((NowSinceEpoch - LastUpdateSinceEpoch >= std::chrono::milliseconds(1)
    { 
       DoSomething()
       LastTimeSinceEpoch = duration_cast<milliseconds>(std::chrono::system_clock::now().time_since_epoch());
    } 

对于Windows和Chrono来说,这是不是有点太多了?它真的能用这么小的时间单位吗?我读过很多关于Windows在超过10毫秒的时间里挣扎的故事。我可以试试其他计时器库

谢谢你的帮助!

听起来你需要这样做:

#include <chrono>
int main()
{
    using namespace std::chrono;
    using clock = steady_clock;
    auto time_up = clock::now() + milliseconds(1);
    while(true)
    {
        std::this_thread::sleep_until(time_up);
        // emit event
        // set time_point for next millisecond
        time_up += milliseconds(1);
    }
}

我会用std::thread::sleep_for()代替。

while(true)
{
    std::this_thread::sleep_for(std::chrono::milliseconds(1));
    DoSomething();
}

在等待调用DoSomething()时,您的解决方案将消耗100%的CPU。通过调用sleep_for(),您可以释放操作系统可能用于其他任务的时间

如果您仍然决定使用spin-wait而不是休眠线程,这可能会为您提供更好的粒度(sleep_for只保证线程将在 最小给定时间内休眠),您应该使用high_resolution_clock代替。

while(true)  
{
    auto lastDoSomethingTime = high_resolution_clock::now();
    if((high_resolution_clock::now() - lastDoSomethingTime) >= milliseconds(1))
    { 
       DoSomething()
       lastDoSomethingTime = high_resolution_clock::now();
    }
}