线程无法在Qt应用程序中唤醒。

时间:2015-12-02 22:04:27

标签: c++ multithreading macos qt

我的Qt应用程序中有sleep_for的问题,可以在此测试程序中复制。

如果测试程序具有焦点,则sleep_for始终在1秒内返回。如果测试程序失去焦点,sleep_for在第一分钟仍然正常返回,但每次都会休眠大约10秒钟。

我尝试使用nanosleep而不是sleep_for,或者使用std线程而不是QThread。得到了同样的问题。

如果我取消注释Qt代码,则睡眠问题就会消失。

我现在很困惑。操作系统会给死循环线程一个惩罚吗?

我在Mac OS X 10.10上使用Qt 5.5.1和clang-602.0.53。

#include <time.h>
#include <thread>
#include <iostream>
#include <QApplication>
#include <QThread>


int sleep_test(void)
{
    while (1)
    {
        auto start = std::chrono::system_clock::now();
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
        //nanosleep((const struct timespec[]){{1, 0}}, nullptr);
        auto end = std::chrono::system_clock::now();

        std::cout << (end-start).count() << std::endl;
    }
    return 0;
}

class QtSleepThread : public QThread
{
    public:
        void run()
        {
            sleep_test();
        }
};

int main(int argc, char * argv[])
{

#if 0
    std::thread t(sleep_test);
    t.join();

#else
    QApplication app(argc, argv);

    //std::thread t(sleep_test);
    QtSleepThread t;
    t.start();

    app.exec();
#endif
    return 0;
}

0 个答案:

没有答案