您的位置:首页 > 其它

利用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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: