利用VTK显示文件读取进度模态对话框
2008-11-18 22:29
1256 查看
以下内容实现用VTK读取DICOM数据,并通过模态对话框显示文件读取进度。
要同时显示对话框并且读入数据,可以使用多线程编程。可参考
http://blog.csdn.net/miracle0521/archive/2006/02/06/592733.aspx
具体步骤如下:
//创建线程
this->m_hTread=CreateThread(NULL,0,readfiles,(LPVOID)&p,0,NULL);
//显示模态对话框
readprogress.DoModal();
//等待线程结束
while (WAIT_TIMEOUT == WaitForSingleObject(m_hTread, 0))
{
Sleep(100);
}
//结束线程
CloseHandle(m_hTread);
而定义的线程函数如下:
DWORD WINAPI readfiles(LPVOID lpParameter)
{
ThreadsParameter *p=(ThreadsParameter *)lpParameter;
p->reader->Run();
while(IsWindow(((ThreadsParameter *)lpParameter)->progressDlg-> m_hWnd))
{
//关闭进度窗口
((ThreadsParameter *)lpParameter)->progressDlg->SendMessage(WM_CLOSE);
Sleep(100);
}
return true;
}
值得注意的是,普通的I/O文件操作,可以在操作未完成时返回一个false,因此读取普通文件的多线程可以这样写:
if (!ReadFile(hSecFile, Buffer, 2048, &dwReadByteNum, NULL))
{
//process
.......
ReadFile(hSecFile, Buffer, 2048, &dwReadByteNum, NULL);
}
VTK的读取DICOM操作主要在Update()这个函数中。我们没法用上述方法做多线程,但是VTK提供了事件响应函数,可以继承vtkCommand这个类,重载Execute函数,通过vtkDICOMImageReader的GetProgress()函数,得到当前进度(0~1之间的数),并将当前进度发送到对话框。
void CReadCommand::Execute(vtkObject* caller, unsigned long eventId, void * callData)
{
vtkDICOMImageReader *reader = reinterpret_cast<vtkDICOMImageReader*>(caller);
progress=reader->GetProgress();
int p=static_cast<int>(progress*100);
this->readprogress->SetCurrentPos(p);
}
同时在vtkDICOMImageReader实例化的对象中,要增加observer,代码如下:
CReadCommand *mo1 = CReadCommand::New();
mo1->readprogress=&readprogress;
reader.GetReader()->AddObserver(
vtkCommand::ProgressEvent,mo1);
要同时显示对话框并且读入数据,可以使用多线程编程。可参考
http://blog.csdn.net/miracle0521/archive/2006/02/06/592733.aspx
具体步骤如下:
//创建线程
this->m_hTread=CreateThread(NULL,0,readfiles,(LPVOID)&p,0,NULL);
//显示模态对话框
readprogress.DoModal();
//等待线程结束
while (WAIT_TIMEOUT == WaitForSingleObject(m_hTread, 0))
{
Sleep(100);
}
//结束线程
CloseHandle(m_hTread);
而定义的线程函数如下:
DWORD WINAPI readfiles(LPVOID lpParameter)
{
ThreadsParameter *p=(ThreadsParameter *)lpParameter;
p->reader->Run();
while(IsWindow(((ThreadsParameter *)lpParameter)->progressDlg-> m_hWnd))
{
//关闭进度窗口
((ThreadsParameter *)lpParameter)->progressDlg->SendMessage(WM_CLOSE);
Sleep(100);
}
return true;
}
值得注意的是,普通的I/O文件操作,可以在操作未完成时返回一个false,因此读取普通文件的多线程可以这样写:
if (!ReadFile(hSecFile, Buffer, 2048, &dwReadByteNum, NULL))
{
//process
.......
ReadFile(hSecFile, Buffer, 2048, &dwReadByteNum, NULL);
}
VTK的读取DICOM操作主要在Update()这个函数中。我们没法用上述方法做多线程,但是VTK提供了事件响应函数,可以继承vtkCommand这个类,重载Execute函数,通过vtkDICOMImageReader的GetProgress()函数,得到当前进度(0~1之间的数),并将当前进度发送到对话框。
void CReadCommand::Execute(vtkObject* caller, unsigned long eventId, void * callData)
{
vtkDICOMImageReader *reader = reinterpret_cast<vtkDICOMImageReader*>(caller);
progress=reader->GetProgress();
int p=static_cast<int>(progress*100);
this->readprogress->SetCurrentPos(p);
}
同时在vtkDICOMImageReader实例化的对象中,要增加observer,代码如下:
CReadCommand *mo1 = CReadCommand::New();
mo1->readprogress=&readprogress;
reader.GetReader()->AddObserver(
vtkCommand::ProgressEvent,mo1);
相关文章推荐
- 利用VTK显示文件读取进度模态对话框
- Matlab GUI,显示学生成绩(读取txt,xls文件),打开文件对话框
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片的两个函数
- C++Builder利用URLDownloadToFile下载文件并显示进度
- 介绍一下MFC对话框工程读取BMP文件并显示的例子
- Visual C++利用互斥量同步线程实现文件读取进度条
- 3 vtk读取并显示dicom文件
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片
- 复制文件时,如何显示进度条(使用BlockRead函数读取数据,并插入application.ProcessMessages)
- 利用jsp+Extjs实现动态显示文件上传进度
- VTK 读取STL文件并且显示
- 多线程:C#.NET中使用BackgroundWorker在模态对话框中显示进度条
- ios 使用NSURlSession 下载文件并且使用进度条进行文件下载进度读取以及打开附件(word,excel,ppt,pdf)显示
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片的两个函数
- 利用curl下载文件(进度条显示) 代码片段
- 利用js实现无刷新上传头像(或文件)并显示进度条
- 利用jsp+Extjs实现动态显示文件上传进度
- Asp.Net 上传大文件专题(4)--利用ajax技术显示上传进度
- Asp.Net 上传大文件专题(4)--利用ajax技术显示上传进度
- Asp.Net 上传大文件(利用ajax技术显示上传进度)