利用VTK显示文件读取进度模态对话框

 以下内容实现用VTK读取DICOM数据,并通过模态对话框显示文件读取进度。

要同时显示对话框并且读入数据,可以使用多线程编程。可参考

http://blog.csdn.net/miracle0521/archive/2006/02/06/592733.aspx
具体步骤如下:

  1.         //创建线程
  2.        this->m_hTread=CreateThread(NULL,0,readfiles,(LPVOID)&p,0,NULL);
  3.       
  4.     //显示模态对话框
  5.         readprogress.DoModal();
  6.  
  7.     //等待线程结束
  8.     while (WAIT_TIMEOUT == WaitForSingleObject(m_hTread, 0))
  9.         {
  10.            Sleep(100);
  11.  
  12.         }
  13.  
  14.         //结束线程
  15.         CloseHandle(m_hTread);

而定义的线程函数如下:

  1. 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,因此读取普通文件的多线程可以这样写:

  1.  if (!ReadFile(hSecFile, Buffer, 2048, &dwReadByteNum, NULL))
  2. {
  3.    //process
  4.     .......
  5.    ReadFile(hSecFile, Buffer, 2048, &dwReadByteNum, NULL);
  6.  
  7. }

     VTK的读取DICOM操作主要在Update()这个函数中。我们没法用上述方法做多线程,但是VTK提供了事件响应函数,可以继承vtkCommand这个类,重载Execute函数,通过vtkDICOMImageReader的GetProgress()函数,得到当前进度(0~1之间的数),并将当前进度发送到对话框。

  1. void CReadCommand::Execute(vtkObject* caller, unsigned long eventId, void * callData)
  2. {
  3.      vtkDICOMImageReader *reader =   reinterpret_cast<vtkDICOMImageReader*>(caller);
  4.      progress=reader->GetProgress();
  5.      int p=static_cast<int>(progress*100); 
  6.      this->readprogress->SetCurrentPos(p);
  7. }

同时在vtkDICOMImageReader实例化的对象中,要增加observer,代码如下:

  1.                 CReadCommand *mo1 = CReadCommand::New();
  2.         mo1->readprogress=&readprogress;
  3.         reader.GetReader()->AddObserver(
  4.                           vtkCommand::ProgressEvent,mo1);

本文来源:http://blog.csdn.net/liuchacha/article/details/3330887

你可能感兴趣的:(VTK,文件读取进度)