Windows下提高sleep精度且不占CPU的两种方式

Windows下sleep精度不够,所以在做高精度即时、媒体播放等对时间间隔有苛刻要求的情况下,sleep完全不满足需求。

C++14中实现了一种‘sleep’的方式,sleep_until()函数,时间精度非常高:

// only some test code
std::chrono::steady_clock::time_point tp = std::chrono::steady_clock::now();

while (true)
{
    // do something...
    on_vitrualRec();

    long interv = long(1.0 / 90 * 1e6);
    tp += std::chrono::microseconds(interv);
    std::this_thread::sleep_until(tp);
}

这种方式甚至处理了do something的耗时,强烈推荐这种方式。

在未发现sleep_until神器之前,都用select函数来达到高精度sleep:

    inline void sleep_with_high_precision(long microseconds)
    {
        timeval timeout = { 0, microseconds };

        // init env
        static bool isInit = false;
        if (!isInit)
        {
            isInit = true;
            WSADATA data;
            WORD w = MAKEWORD(2, 0);
            ::WSAStartup(w, &data);
        }

        // Initial a socket
        static fd_set rfds;
        static SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

        // set a socket to watch
        FD_ZERO(&rfds);
        FD_SET(sock, &rfds);

        // Watch a never used socket
        ::select(1, &rfds, NULL, NULL, &timeout);
    }

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据