派生オブジェクトが作成されるワーカー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。