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"; 
     } 
  };
};

QThread によって呼び出されたので、永久ループは UI をスタックさせました。このコードの何が問題なのか、誰か指摘できますか?

4

1 に答える 1

3

Widget::dowork()(GUIが実行される)メインスレッドで実行されるため、ブロックされます。QThreadによって呼び出されたかどうかは関係ありません。

別のスレッドでコードを実行する正しい方法は、最初にを使用してQObjectインスタンスをQTh​​readに移動し、次にQThreadのシグナルを実行するQObjectインスタンスのスロットにQObject::moveToThread()接続することです。started()

詳細を知りたい場合:https ://www.qt.io/blog/2010/06/17/youre-doing-it-wrong

コードのもう1つの問題は、QWidgetから派生したオブジェクトを別のスレッドに移動しようとしていることです。これは許可されていません。QWidgetインスタンスはメインスレッドに残っている必要があります。代わりに、QObjectからサブクラス化する必要があります。

コードに関するさらに別の問題は、コンストラクターでこれを行っていることです。まだ完全に構築されていない状態でオブジェクトを別のスレッドに移動することは、問題を引き起こしているだけです。

于 2012-10-30T15:30:01.240 に答える