2012-03-09 6 views
1

シグナルが失われている理由がわかりません - イベントループの開始前に正常に送信されたシグナルはキューに入れられて送信されます。以前のシグナルQThreadイベントループの開始が失われました

これは、コードは(QThreadオブジェクトの)次のようになります。

void OffloadHandler::run() 
{ 
    cout << "Start" << endl; 
    connect(this, SIGNAL(loopStarted()), SLOT(onLoopStarted()), Qt::QueuedConnection); 
    emit loopStarted(); 
    exec(); 
} 

void OffloadHandler::onLoopStarted() 
{ 
    cout << "Here!" << endl; 
} 

スレッドが別の場所で開始され、Startがコンソールに書き込まれますが、Here1は決してありません - 信号が受信されません。私はメインのメッセージループで同じパターンを使用し、それは動作しますが、このスレッドメッセージループでは動作しないようです。

私のコードに間違いがありますか?

+0

この "loopStarted"はどこから放出されますか? – Koying

+0

スレッド内にあります。 –

答えて

0

私はそれを理解しました。私はQThreadの所有権の奇妙さに噛まれました。 QThreadオブジェクト自体に接続するときは、そのオブジェクトがデフォルトでスレッドによって所有されていないため、実際には注意が必要です。私はスレッドにスレッドを移動させなければならないスレッドが作成された時点でそう

OffloadHandler * oh = new OffloadHandler(); 
oh->moveToThread(oh); //MOVE TO SELF! 
oh->start(); 

私は期待通りの信号が動作し、これを行うたら。

+0

Qtドキュメントでは、QThreadのサブクラス化を推奨していますが、一般的に意図された使用に反して考えられます。スレッドを自分自身に移動させることは、間違いなく普及し続ける普遍的な反パターンです。それはあなたの直面する問題を解決するかもしれませんが、それが作り出す問題はより狡猾です。 QtとスレッドのためにSOを検索してください。http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ –

+0

この記事の多くの言及が見つかります。アイデアをサブクラス化しないでください私はあなたがスレッドでメッセージループを開始することができるだろうと見ていない。 'exec'は保護されたメンバ関数です - この目的のために新しいQEventLoopを作るのはむしろ愚かなようです。 –

+0

私は自分自身にスレッドを動かさないということについても少しは買わない。スレッドにはオーナースレッドがありません。スレッドを作成するために特別なものは何ですか?今は独自の独立したエンティティです。 –

1

コードは有効であり、実行する必要があります。 ohが作成されたスレッドでイベントループが実行されていますか?

emit loopStarted()は、ohのイベントループにイベントを送信する必要があります。処理され、onLoopStarted()が呼び出されます。私はあなたのコードをテストし、それは私のために働く。


ところで、一般的には、あなたのQThreadにスロットを追加し、残念ながら、私は本当にあなたのユースケースを理解していないmoveToThread(this);

使用を避けるので、私はより良い与えることはできませんしないことをお勧めします溶液。しかし、hereは、QThreadに関する素晴らしいDOとDONTを持つすばらしいドキュメントです。

+0

+0.5 :)これは興味深い記事ですが、私は 'QThread'をsuclassingする例は示しませんでした。私は、 'QObject'サブクラスに作業を入れ、それを' QThread'インスタンスに移すことを中心とする提案がより良い選択であると信じています。 –

関連する問題