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

时间:2011-07-18 12:02:14

标签: c++ qt

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

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

QObject::startTimer: timers cannot be started from another thread

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

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

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

它能与之相关联?我知道,这个问题非常普遍,但我甚至无法理解,要显示的是哪一段代码。

1 个答案:

答案 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));