DICOMデータ セットを読み取り、 VTKライブラリを使用してボリューム レンダリング技術でそれらを視覚化するアプリケーションを設計しています。とにかく、私が扱っている問題は、ボリューム レンダリングが実際には CPU バウンド プロセスであることです。シングル スレッド プロセスでボリューム レンダリングを処理すると、アプリケーション (GUI) がフリーズし、「応答なし」状態になります。ボリューム レンダリング プロセス用に別のスレッドを作成しました。ただし、GUI は引き続きフリーズします。コードは次のとおりです。
private: System::Void volumeRenderButton_Click(System::Object^ sender, System::EventArgs^ e) {
volumeRenderThread = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this, &Form1::volumeRender));
volumeRenderThread->Priority = System::Threading::ThreadPriority::Lowest;
volumeRenderThread->Start();
}
private: void volumeRender()
{
threeDPictureBox->Invoke(gcnew volumeDelegate(this, &Form1::volumeDelegateMethod));
/*
if ( threeDPictureBox->InvokeRequired )
{
threeDPictureBox->Invoke(gcnew System::Action(this, &Form1::volumeRender));
}
else
{
dicom->VolumeRender(threeDPictureBox, vrSettings);
}
*/
}
private: delegate void volumeDelegate();
private: void volumeDelegateMethod()
{
dicom->VolumeRender(threeDPictureBox, vrSettings);
}
void Dicom::VolumeRender( Windows::Forms::PictureBox ^pictureBox, VRsettings *settings )
{
renderer = vtkSmartPointer < vtkRenderer > :: New();
renderWindow = vtkSmartPointer < vtkWin32OpenGLRenderWindow > :: New();
renderWindow->AddRenderer(renderer);
renderWindow->SetParentId((HWND)((pictureBox->Handle).ToPointer()));
renderWindow->SetSize(pictureBox->Width, pictureBox->Height);
renderWindow->Initialize();
/* A lot of stuff here */
...
...
renderWindow->Render();
iren->Initialize(); // vtkWin32RenderWindowInteractor
}
threeDPictureBoxは、dicomオブジェクトのvolumeRenderメソッドに送っているPictureBoxコンポーネントです。vrSettings は、ボリューム レンダリング パラメータの構造体です。
ボリューム レンダリング ボタンがクリックされ、クリック イベント ハンドラーが起動されると、ボリューム レンダー スレッドが開始され、優先度を最低に設定していてもアプリケーションがフリーズします。コメントされている行も試しました。それらのどれも機能しません。私が見逃しているポイントは何ですか?? 今から答えてくれてありがとう!!