我正在设计一个应用程序,它读取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 是一个 PictureBox 组件,我将它发送到 dicom 对象的 volumeRender 方法。vrSettings 是体积渲染参数的结构。
当单击音量渲染按钮并触发单击事件处理程序时,即使我将其优先级设置为最低,volumeRenderThread 也会启动并冻结应用程序!我也尝试过评论的行。它们都不起作用。我错过了什么?感谢您从现在开始的答案!