为什么在 QThread(事件循环)之外调用 QTimer::start() 不会失败?

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不是QThreadandTimers can only be used with threads started with QThread

问题

为什么这不会失败?

eyl*_*esc 5

看来你没有正确理解文档的意思,我们来分析一下各部分的语句:


在多线程应用程序中,您可以在任何具有事件循环的线程中使用 QTimer。

你在哪里使用了QTimer,有事件循环吗?是的,您正在主线程中使用 QTimer,并且您已经通过 QXApplication 创建了事件循环。

要从非 GUI 线程启动事件循环,请使用 QThread::exec()

主线程是非GUI线程吗?不,所以在这种情况下没有必要使用QThread来在主线程中使用QTimer。

QTimer 在什么情况下会失败?如果 QTimer 在主线程中运行并且您尚未创建 QXApplication,或者如果您在没有 Qt 事件循环的线程中运行它作为 std::thread。


结论:

如果QTimer在主线程中使用,只需运行QXApplication即可,如果要在另一个线程中使用它,则必须使用QThread。换句话说,QTimer 仅在存在 Qt 事件循环时才起作用。