我在Qt(4.7.2)中创建了一个多线程应用程序。只有主线程有一个事件循环。
问题是有时我在控制台中收到以下警告:
QObject::startTimer: timers cannot be started from another thread
在这种情况发生后,该应用程序消耗100%的CPU(我有一个核心CPU)。似乎主线程占用了所有CPU的资源。该程序不会冻结,一切仍然有效。
当我在调试器中停止程序时,我在调用堆栈中看不到我的代码。
问题在于我根本没有使用(明确地,无论如何)定时器。
它能与之相关联?我知道,这个问题非常普遍,但我甚至无法理解,要显示的是哪一段代码。
答案 0 :(得分:9)
谢谢@vrince我已经解决了这个问题。我使用信号/插槽机制+ Qt::QueuedConnection
与GUI进行通信
例如,如果我需要从工作线程设置QLabel
的文本,我可以在我的工作线程信号中生成
void textChanged(QString);
然后我使用QLabel
Qt::QueuedConnection
的广告位
connect(worker, SIGNAL(textChanged(QString)), label, SLOT(setText(QString), Qt::QueuedConnection);
如果我想同步执行setText
,我可以使用Qt::BlockingQueuedConnection
现在在我的工作线程中我只发出信号:
emit textChanged(newText);
此外,可以使用QMetaObject
函数来避免信号和插槽:
metaObject->invokeMethod(label, "setText", Qt::QueuedConnection, Q_ARG(QString, text));