我在 Qt (4.7.2) 中创建了一个多线程应用程序。只有主线程有事件循环。
问题是有时我在控制台中收到以下警告:
QObject::startTimer: timers cannot be started from another thread
发生这种情况后,应用程序会消耗 100% 的 CPU(我有一个单核 CPU)。看起来,主线程消耗了所有的 CPU 资源。该程序不会卡住,一切仍然有效。
当我在调试器中停止程序时,我没有在调用堆栈中看到我的代码。
问题是我根本没有使用(明确地,无论如何)计时器。
它可以连接什么?我知道,这个问题很常见,但我什至不明白要显示哪一段代码。
最佳答案
感谢@vrince,我已经解决了这个问题。我使用信号/槽机制 + Qt::QueuedConnection
与 GUI 通信
例如,如果我需要从工作线程设置QLabel
的文本,我可以在我的工作线程信号中制作
void textChanged(QString);
然后我使用 Qt::QueuedConnection
QLabel
的插槽
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));
关于c++ - "QObject::startTimer: timers cannot be started from another thread"没有计时器 && CPU 消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6732583/