我的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;
}