"QObject :: startTimer:定时器不能从另一个线程启动"没有定时器&& CPU消耗

Lol*_*4t0 8 c++ qt

我在Qt(4.7.2)中创建了一个多线程应用程序.只有主线程有一个事件循环.

问题是有时我在控制台中收到以下警告:

QObject::startTimer: timers cannot be started from another thread
Run Code Online (Sandbox Code Playgroud)

发生这种情况后,应用程序消耗100%的CPU(我有一个核心CPU).似乎主线程占用了所有CPU的资源.该程序不会冻结,一切仍然有效.

当我在调试器中停止程序时,我在调用堆栈中看不到我的代码.

问题是我根本没有使用(明确地,无论如何)定时器.

有什么可以与之相关?我知道,这个问题很常见,但我甚至无法理解,要展示哪些代码.

Lol*_*4t0 9

谢谢,@ vrince我已经解决了这个问题.我使用信号/插槽机制+ Qt::QueuedConnection与GUI通信

例如,如果我需要设置QLabel工作线程的文本,我可以在我的工作线程信号中

void textChanged(QString);
Run Code Online (Sandbox Code Playgroud)

然后我将此信号连接到QLabel使用的插槽Qt::QueuedConnection

connect(worker, SIGNAL(textChanged(QString)), label, SLOT(setText(QString), Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)

如果我想setText同步执行,我可以使用Qt::BlockingQueuedConnection

现在在我的工作线程中我只发出信号:

emit textChanged(newText);
Run Code Online (Sandbox Code Playgroud)

此外,可以使用QMetaObject函数来避免信号和插槽:

metaObject->invokeMethod(label, "setText", Qt::QueuedConnection, Q_ARG(QString, text));
Run Code Online (Sandbox Code Playgroud)