c++ - "QObject::startTimer: timers cannot be started from another thread"没有计时器 && CPU 消耗

标签 c++ qt

我在 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/

相关文章:

c# - 如何在 C++ 中创建 dll 以便在 C# 中使用

qt - 有没有办法在父小部件上叠加多个项目(PySide/Qt)

c++ - 如何使用 QTreeView 获取有关所选项目的详细信息?

c++ - QDialog::setResult 自定义返回值

c++ - 事件队列和互斥锁

c++ - 通过引用返回 std::vector 导致段错误

c++ - 将在抽象基类上定义的 vector 的元素与具体的派生类进行匹配

python - 从 C++ 调用 Python 函数

c++ - 使用虚拟基类时多重继承如何工作?

qt - 在Qt中更改编译器