3

例を挙げましょう。

class B : public  QThread {
public:
  void run() {
  }
};

class A : public QThread {
public:
  void run() {
     b1.start(); b2.start();
  }
protected:
  B b1, b2;
};

A::b1 と A::b2 を、親スレッド (A) のリソースを共有するのではなく、完全に独立したスレッドとして実行したい。メインスレッドを b1 と b2 の親スレッドとして指定する方法はありますか?

QThreadPool と QRunnable も調べましたが、スレッドプールのすべてのランナブルを管理する (たとえば、そのうちの 1 つを停止してから再度実行する) 方法がわかりません。

4

1 に答える 1

5

サブクラス化QThreadは、Qt でスレッドを作成する間違った方法です。オブジェクトとその子のスレッド アフィニティを簡単に変更できるQObject関数を提供します。moveToThread

このオブジェクトとその子のスレッド アフィニティを変更します。親を持つオブジェクトは移動できません。イベント処理は targetThread で続行されます。

オブジェクトをメイン スレッドに移動するには、QApplication::instance() を使用して現在のアプリケーションへのポインターを取得し、次に QApplication::thread() を使用してアプリケーションが存在するスレッドを取得します。

したがって、実行関数QObjectの代わりに継承しQThread、B オブジェクトを他のスレッドに移動するように変更する必要があります。

サンプルコード (未テスト)

class B : public  QObject {
  Q_OBJECT
public:
  void run() {
  }
};

class A : public QObject {
  Q_OBJECT
public:
  void run() {
     b1Thread = new QThread;
     b2Thread = new QThread;
     b1.moveToThread(b1Thread);
     b2.moveToThread(b2Thread);

     b1.run(); 
     b2.run();
  }
protected:
  B b1, b2;
private:
  QThread* b1Thread, b2Thread; // Delete them in the destructor.
};

でスレッドを構築し、それらを引数としてクラスmain.cppに渡すことができます。B

以下について注意してくださいmoveToThread

この関数は、現在のスレッドから別のスレッドにオブジェクトを「プッシュ」することしかできず、任意のスレッドから現在のスレッドにオブジェクトを「プル」することはできません。

于 2011-11-09T10:30:42.070 に答える