サブクラス化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
この関数は、現在のスレッドから別のスレッドにオブジェクトを「プッシュ」することしかできず、任意のスレッドから現在のスレッドにオブジェクトを「プル」することはできません。