线程冻结应用程序 [英] Thread freezing the application
问题描述
我正在设计一个应用程序,它可以读取 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();
/ *很多东西在这里* /
...
...
renderWindow-> Render();
iren-> Initialize(); // vtkWin32RenderWindowInteractor
}
threeDPictureBox是一个PictureBox组件将其发送到dicom对象的volumeRender方法。 vrSettings是卷呈现参数的结构。
当点击音量渲染按钮并点击事件处理程序时,volumeRenderThread会启动并冻结应用程序,即使我已设置其优先级最低!我也试过了评论的线。他们没有工作。什么是我错过了点?感谢您的回答!
您的线程是在立即跳转到UI线程的方法上调用的。 p>
换句话说,它有一个动作:告诉UI线程做这项工作。
I'm designing an application which reads DICOM data sets and visualizes them with volume rendering techniques by using VTK library. Anyway, the problem I'm dealing is volume rendering is really CPU-bounded process. If I handle the volume rendering in a single threaded process, application (GUI) freezes and passes to "not responding" state. I have written another thread for volume rendering process. However GUI still freezes, here are the codes.
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 is a PictureBox component that I'm sending it to volumeRender method of dicom object. vrSettings is a struct for volume Rendering parameters.
When the volume Render button is clicked and click event handler fired, volumeRenderThread starts and freezes the application even I have set its priority Lowest! I have also tried the lines which is commented. None of them works. What's the point I'm missing?? Thanks for answers from now!!
Your thread is invoked on a method that immediately jumps back onto the UI thread.
In other words, it has one action: tell the UI Thread to do the work.
这篇关于线程冻结应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!