私のプログラムが何をしていたのか、何を変更しようとしているのかを説明しようとします:
クラス MainWindow のメインスレッドからボタンクリックで実行されるこの関数がありました: public QMainWindow :
関数は次のようになり、別のファイル内で指定されます。
void MakeMeshStructure(MeshStructureLayers layers,
Handle_AIS_InteractiveContext theContext,
Handle_TDocStd_Document aDoc,
MyMesh &mesh,
int detail_vertex,
double insulation_thickness,
OpenMesh::VPropHandleT<MyMesh::Scalar> _max_beam_offset);
}
メッシュで機能し、メッシュのすべての頂点、面、エッジのジオメトリを作成します。このジオメトリは、Context で表示されます。このプロセスには非常に時間がかかり (30 分)、GUI がブロックされます。
私がやりたいことは、QThread::idealThreadCount() と同じ数のスレッドを持ち、計算時に GUI を解放して高速化することです。(これは正しい考えですか?)
メッシュを等分に分割し、この範囲の頂点を関数 (上記) に渡して、別のトレッドの 1 つの頂点範囲のみを操作したいと考えています。
このデータをどのように渡し、スレッドセーフにするかを理解するのに問題があります。私はその多くのコードを知っていますが、これを解決するための私の試みは次のとおりです。
問題は、すべてのデータを正しい方法で取得し、スレッドを機能させることです。どこでミューテックスを使用する必要がありますか。メインスレッドによるスレッド作業時に書き込むことができるすべてのデータについて? 非常に混乱。タイ
編集:
コードを編集しました: http://pastebin.com/u/mzagar 構造体 cadData を作成してデータを渡しました。これは私がスレッドを開始する方法です:
connect(this, SIGNAL(startMake1(cadData)), cThreads.at(0), SLOT(MakeMesh(cadData)));
//...
cThreads.at(0)->moveToThread(threads.at(0));
//...
threads.at(0)->start();
//...
emit startMake1(aCadDatas.at(0));
//...
問題は、スレッドが同時に機能していないように見え、GUI がフリーズすることです。プロセスは次のようになります。
- GUI がフリーズする
- スレッド 1 の処理
- スレッド 1 の処理がやり直されます
- スレッド 2 の処理
- スレッド 2 の処理が再び行われます
- ...
- GUI がフリーズしない
理由はありますか?
編集2:
これをクラス コンストラクターに移動して、同じスレッドの複数回の実行を削除しました。
connect(this, SIGNAL(startMake1(cadData)), cThreads.at(0), SLOT(MakeMesh(cadData)));
//...
cThreads.at(0)->moveToThread(threads.at(0));
//...
threads.at(0)->start();