文档说
在多线程应用程序中,您可以在任何线程中使用 QTimer 具有事件循环。要从非 GUI 线程启动事件循环,请使用 QThread::exec((.Qt使用计时器的线程亲和力来确定 哪个线程将发出超时((信号。因此,您必须 在其线程中启动和停止计时器;无法启动 来自另一个线程的计时器。
所以我期待这段代码...
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QTimer timer;
timer.start(1000);
app.exec();
}
。失败,因为我调用start
的主线程不是QThread
和Timers 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 事件循环时才有效。