使用 Windows 和 C++ chrono 为每个人安排 1 毫秒的事件 - 我要求太多了吗?

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

我有一些代码是这样的:

    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 毫秒的挣扎。我可以尝试的任何其他计时器库

感谢您的帮助!

我会改用 std::thread::sleep_for()

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

您的解决方案在等待调用 DoSomething() 时将消耗 100% CPU。通过调用 sleep_for(),您可以腾出时间,OS 可以用于其他任务。

如果您仍然决定旋转等待而不是让线程休眠,这可能会给您更好的粒度(sleep_for 仅保证线程将休眠 at 最少给定的时间),你应该使用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();
    }
}

听起来你需要这样的东西:

#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);
    }
}