线程冻结应用程序 [英] Thread freezing the application

查看:180
本文介绍了线程冻结应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在设计一个应用程序,它可以读取 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆