gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:27:40 25 4
gpt4 key购买 nike

documentation says

In multithreaded applications, you can use QTimer in any thread that has an event loop. To start an event loop from a non-GUI thread, use QThread::exec(). Qt uses the timer's thread affinity to determine which thread will emit the timeout() signal. Because of this, you must start and stop the timer in its thread; it is not possible to start a timer from another thread.



所以我希望这个代码......
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

问题

为什么这不会失败?

最佳答案

看来你没有正确理解文档说明的内容,让我们分析一下语句的每个部分:

In multithreaded applications, you can use QTimer in any thread that has an event loop.



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

To start an event loop from a non-GUI thread, use QThread::exec()



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

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

结论:

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

关于multithreading - 为什么在 QThread(事件循环)之外调用 QTimer::start() 不会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58458799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com