4

myObjectと呼ばれるQObjectのサブクラスがあり、コンストラクターのヒープにQTimerデータメンバーが割り当てられています。myObjectには、コンストラクターのQTimer timeout()シグナルに接続されているスロットもあります。myObjectのポインタをmyObject_ptrと呼びます。

myObjectをメインスレッドとは別のスレッドで実行したい。比較的新しい推奨事項に従って、QThreadをサブクラス化しません。メインスレッドでは、myObjectを次のように使用します。

QThread *thread = new QThread(this);
myObject_ptr->moveToThread(thread);
connect(myObject_ptr, SIGNAL(destroyed(), thread, SLOT(quit())); //thread not needed if no object
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); //to avoid memory leak
connect(thread, SIGNAL(terminated()), thread, SLOT(deleteLater())); //to avoid memory leak
thread->start();

メインスレッドはmyObject_ptrの関数を呼び出し、myObject_ptrはQTimerデータメンバーを開始します。タイムアウトしても何も起こりませんが、タイマーのtimeout()シグナルが接続されているmyObjectのスロットが呼び出されることを期待しています。何が問題ですか?これをどのように機能させますか。myObjectが作成されたのと同じスレッド、つまりメインスレッドで実行されている場合は、問題なく動作します。

私が行ったすべての読み取りから、私が作成している新しいスレッドは、独自のイベントループを持たないため、イベントを処理していない可能性があると思います。また、スレッドの開始時にrun()関数がexec()を呼び出し、イベントループがあると言って、それとは反対のドキュメント/記事を読みました。

誰かが私を助けてくれませんか?

QThreadをサブクラス化すれば、おそらく正しく機能するようになりますが、現在の推奨事項に基づいて、それを避けたいと思います。

前もって感謝します。

4

1 に答える 1

3

私は私の問題を解決しました!! MyObject のコンストラクターでは、次のようにタイマーがヒープに割り当てられます。

timer_ptr = new QTimer(this);

ただし、正しく機能するには、次のようにする必要があります。

timer_ptr = new QTimer(0);

デストラクタで、オブジェクトを手動で削除します。

timer_ptr->deleteLater();

親を持つオブジェクトをスレッドに移動できないと言うとき、実際には、実際に新しいスレッドに移動されるオブジェクトのデータメンバーを含む、すべてのオブジェクトを意味していると思います。

ハッピーコーディング。

于 2012-11-05T02:42:17.977 に答える