我想我可能误解了Qt线程中的几个概念,
在我的窗口类中,它派生自 QWidget:
class Widget
{
Q_OBJECT
public:
Widget::Widget (QObject *parent = 0) : QObject(parent)
{
moveToThread(&th); // still stuck
connect (&th, SIGNAL(started()), SLOT(doWork()));
th.start();
}
private:
QThread th;
private slots:
void doWork ()
{
// hmm, this stuck the UI
while (1)
{
qDebug() << "Sleeping";
}
};
};
永远的循环卡住了 UI,这不应该是这样,因为它是由 QThread 调用的。
谁能指出这段代码有什么问题吗?
Widget::dowork()
在主线程(GUI 运行的主线程)上执行,这就是它阻塞的原因。它是由 QThread 调用的并不重要。
在另一个线程上执行代码的正确方法是首先使用以下命令将 QObject 实例移动到 QThreadQObject::moveToThread()
,然后连接started()
将 QThread 的信号发送到要执行的 QObject 实例的插槽。
如果您想了解更多:https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong
您的代码的另一个问题是您试图将 QWidget 派生的对象移动到另一个线程。这是不允许的。 QWidget 实例必须保留在主线程上。相反,您应该从 QObject 子类化。
代码的另一个问题是您在构造函数中执行此操作。在对象尚未完全构建时将其移动到另一个线程只是自找麻烦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)