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をサブクラス化すれば、おそらく正しく機能するようになりますが、現在の推奨事項に基づいて、それを避けたいと思います。
前もって感謝します。