0

派生オブジェクトが作成されるワーカーQThreadがあります。QObjectオブジェクトは、他の2つの派生オブジェクトの集合体であるQObjectため、2つの内部オブジェクトを信号でリンクおよびバインドするための内部接続があります。

ワーカーQThreadはのメンバーであるQPluginため、プラグインの存続​​期間中ずっと存在します。

私が抱えている問題は、オブジェクトがアプリケーションの他の部分と正常に相互作用しているにもかかわらず、それらの内部接続が壊れているように見えることです。実験として、メインスレッドでオブジェクトを作成しようとしましたが、内部接続が機能しているので、これは間違いなく私が間違っていることですQThread

また、オブジェクトをメインスレッドに戻してみましたが(確かに、これらの内部接続が確立された後)、効果はありませんでした。内部接続のすべてのタイプの接続(直接、キューなど)を循環しましたが、効果がないか、デッドロックエラーが発生しました。接続を通過したすべてのタイプが登録されます。

オブジェクトは含まれている2つのオブジェクトの親QObjectであり、すべて同じスレッドに存在するため、違いはありませんが、除外するために親をNULLに設定してみましたが、当然のことながら効果はありませんでした。は何の親でもQThreadありません。

私が確信していない唯一のことは、オブジェクトがメインスレッドにあるファクトリシングルトンから作成されているが、ワーカースレッドから呼び出されているということです-それで、それは誰に属しているのですか?私はこれらの接続を切断するために何をしているのか(またはしていないのか)について完全に途方に暮れているので、どんな助けでも大歓迎です。アプリケーションの関連部分のコードは次のとおりです。

これはワーカースレッドでのオブジェクト作成呼び出しです。コンテキストでは、オブジェクトはOBJインポーターからのポリメッシュです。

//  Create mesh.
QString type = Sy::plugMeshType + "Sy_polyMesh";
QString name = proj->newNameIncrement( "objMesh" );

Sy::PluginArgs args; args << name;
Sy_polyMesh* obj = Sy_pluginLoader::createInstance< Sy_polyMesh >( type, args );
obj->mesh() = mesh;
obj->resizeBB();
result_ = obj;

//  If in GUI mode, register it with the project.
if ( gui_ ) {
    proj->registerSimObject( obj );
    proj->selectObject( obj );
}

私のアプリには非常に広範なプラグインアーキテクチャがあるため、実際のスレッド開始コードは抽象ワーカークラスに抽象化されます。

void Sy_abstractLongProcess::begin( Sy_abstractLongProcessWorker* worker )
{
    worker_ = worker;
    worker_->moveToThread( &thread_ );

    QObject::connect( &thread_, SIGNAL( started() ), worker_, SLOT( work() ) );

    QObject* thisObj = dynamic_cast< QObject* >( this );

    QObject::connect( &thread_, SIGNAL( finished() ), worker_, SIGNAL( finished() ) );
    QObject::connect( worker_, SIGNAL( finished() ), thisObj, SIGNAL( finished() ) );
    QObject::connect( worker_, SIGNAL( progressChanged( double ) ), thisObj, SIGNAL( progressChanged( double ) ) );
    QObject::connect( worker_, SIGNAL( finished() ), &thread_, SLOT( quit() ) );

    thread_.start();
}

関連するすべてのコードが多くのクラスに分散しているため、すべてをリストすることはしません(この質問は十分に長いです)が、他に何かを見る必要がある場合は、遠慮なく質問してください-私はこれについて得ることができるすべての助けが必要です1。

4

1 に答える 1

0

オブジェクトをメインスレッドに戻そうとしたとき、元の投稿でほとんど答えがありましたが、それをするのが早すぎました。ワーカー スレッドで必要な変更を完了したら、元に戻す必要がありました。

それを解決するために私を軌道に乗せてくれたマットに感謝します

于 2011-11-27T23:01:22.337 に答える