0

我想我可能误解了 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 调用的。谁能指出这段代码有什么问题?

4

1 回答 1

3

Widget::dowork()在主线程(运行 GUI)上执行,这就是它阻塞的原因。它被 QThread 调用并不重要。

在另一个线程上执行代码的正确方法是首先使用 将 QObject 实例移动到 QThread QObject::moveToThread(),然后将started()QThread 的信号连接到要执行的 QObject 实例的槽。

如果您想了解更多:https ://www.qt.io/blog/2010/06/17/youre-doing-it-wrong

您的代码的另一个问题是您试图将 QWidget 派生的对象移动到另一个线程。这是不允许的。QWidget 实例必须保留在主线程上。相反,您应该从 QObject 继承。

代码的另一个问题是您在构造函数中执行此操作。在对象尚未完全构造时将其移动到另一个线程只是自找麻烦。

于 2012-10-30T15:30:01.240 回答