- ImageFileDocument* pReconDoc = theApp->newImageDoc();
- if (! pReconDoc) {
- sys_error (ERR_SEVERE, "Unable to create image file");
- return;
- }
- pReconDoc->setImageFile (pImageFile);
- if (theApp->getAskDeleteNewDocs())
- pReconDoc->Modify (true);
- pReconDoc->UpdateAllViews (this);
- if (ImageFileView* rasterView = pReconDoc->getView()) {
- rasterView->OnUpdate (rasterView, NULL);
- rasterView->getFrame()->SetFocus();
- rasterView->getFrame()->Show(true);
- }
- *theApp->getLog() << os.str().c_str() << "\n";
- pImageFile->labelAdd (rProj.getLabel());
- pImageFile->labelAdd (os.str().c_str(), timerRecon.timerEnd());
-
- } else {
- if (theApp->getUseBackgroundTasks() || theApp->getNumberCPU() > 1) {
- ThreadedReconstructor* pReconstructor = new ThreadedReconstructor (this,
- m_iDefaultNX, m_iDefaultNY, optFilterName.c_str(),
- m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
- optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), os.str().c_str());
- if (! pReconstructor->start()) {
- delete pReconstructor;
- return;
- }
- // delete pReconstructor; // reconstructor is still running
- } else {
- ImageFile* pImageFile = new ImageFile;
- pImageFile->setArraySize (m_iDefaultNX, m_iDefaultNY);
- Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(),
- m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
- optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace);
-
- wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT );
- for (int iView = 0; iView < rProj.nView(); iView++) {
- pReconstructor->reconstructView (iView, 1);
- if (! dlgProgress.Update (iView + 1)) {
- delete pReconstructor;
- delete pImageFile;
- return;
- }
- }
- pReconstructor->postProcessing();
+ return;
+ }
+ ::wxYield();
+ ::wxYield();
+ while (pDlgReconstruct->isPaused()) {
+ ::wxYield();
+ ::wxUsleep(50);
+ }
+ }
+ pReconstructor->postProcessing();
+ delete pDlgReconstruct;
+ delete pReconstructor;
+ } else {
+#if HAVE_WXTHREADS
+ if (theApp->getUseBackgroundTasks()) {
+ ReconstructorSupervisorThread* pReconstructor = new ReconstructorSupervisorThread (this,
+ m_iDefaultNX, m_iDefaultNY, optFilterName.c_str(),
+ m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
+ optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), os.str().c_str());
+ if (pReconstructor->Create() != wxTHREAD_NO_ERROR) {
+ sys_error (ERR_SEVERE, "Error creating reconstructor thread");
+ delete pReconstructor;
+ return;
+ }
+ pReconstructor->SetPriority (60);
+ pReconstructor->Run();
+ return;
+ } else
+#endif
+ {
+ pImageFile = new ImageFile (m_iDefaultNX, m_iDefaultNY);
+ Reconstructor* pReconstructor = new Reconstructor (rProj, *pImageFile, optFilterName.c_str(),
+ m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(),
+ optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace);
+
+ wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT );
+ for (int iView = 0; iView < rProj.nView(); iView++) {
+ pReconstructor->reconstructView (iView, 1);
+ if (! dlgProgress.Update (iView + 1)) {