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



文档说

在多线程应用程序中,您可以在任何线程中使用 QTimer 具有事件循环。要从非 GUI 线程启动事件循环,请使用 QThread::exec((.Qt使用计时器的线程亲和力来确定 哪个线程将发出超时((信号。因此,您必须 在其线程中启动和停止计时器;无法启动 来自另一个线程的计时器。

所以我期待这段代码...

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QTimer timer;
timer.start(1000);
app.exec();
}

。失败,因为我调用start的主线程不是QThreadTimers 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 事件循环时才有效。

相关内容

  • 没有找到相关文章

最新更新