Bob*_*Bob 4 qt multithreading qt5 qtimer
文档说
在多线程应用程序中,您可以在任何具有事件循环的线程中使用 QTimer。要从非 GUI 线程启动事件循环,请使用 QThread::exec()。Qt 使用计时器的线程关联来确定哪个线程将发出 timeout() 信号。因此,您必须在其线程中启动和停止计时器;不可能从另一个线程启动计时器。
所以我期望这段代码......
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QTimer timer;
timer.start(1000);
app.exec();
}
Run Code Online (Sandbox Code Playgroud)
...失败,因为我调用的主线程start
不是QThread
andTimers can only be used with threads started with QThread
问题
为什么这不会失败?
看来你没有正确理解文档的意思,我们来分析一下各部分的语句:
在多线程应用程序中,您可以在任何具有事件循环的线程中使用 QTimer。
你在哪里使用了QTimer,有事件循环吗?是的,您正在主线程中使用 QTimer,并且您已经通过 QXApplication 创建了事件循环。
要从非 GUI 线程启动事件循环,请使用 QThread::exec()
主线程是非GUI线程吗?不,所以在这种情况下没有必要使用QThread来在主线程中使用QTimer。
QTimer 在什么情况下会失败?如果 QTimer 在主线程中运行并且您尚未创建 QXApplication,或者如果您在没有 Qt 事件循环的线程中运行它作为 std::thread。
结论:
如果QTimer在主线程中使用,只需运行QXApplication即可,如果要在另一个线程中使用它,则必须使用QThread。换句话说,QTimer 仅在存在 Qt 事件循环时才起作用。