X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fthreadrecon.cpp;h=0ec059bbcb2293be950c8731d8b29878deafe068;hb=793b8154fdc069e43a939852657e89847d01ee77;hp=c075fb426118ba04081c9bdaa4e95b82d99b4419;hpb=52f2fdc3424cd6b5b77ad1497243e1e06739ffe6;p=ctsim.git diff --git a/src/threadrecon.cpp b/src/threadrecon.cpp index c075fb4..0ec059b 100644 --- a/src/threadrecon.cpp +++ b/src/threadrecon.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2001 Kevin Rosenberg ** -** $Id: threadrecon.cpp,v 1.15 2001/03/02 21:11:50 kevin Exp $ +** $Id: threadrecon.cpp,v 1.20 2001/03/04 22:30:20 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -70,9 +70,8 @@ ReconstructorSupervisorThread::Entry() m_strInterpName.c_str(), m_iInterpParam, m_strBackprojectName.c_str(), m_strLabel.c_str()); reconSupervisor.start(); - while (! reconSupervisor.isDone() && ! reconSupervisor.fail()) { + while (! reconSupervisor.workersDone() && ! reconSupervisor.fail() && ! reconSupervisor.cancelled()) { Sleep(100); - Yield(); } if (reconSupervisor.fail()) { @@ -83,10 +82,12 @@ ReconstructorSupervisorThread::Entry() eventLog.SetString( msg ); wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event } + if (! reconSupervisor.cancelled()) + reconSupervisor.onDone(); + reconSupervisor.deleteWorkers(); while (! reconSupervisor.workersDeleted()) { Sleep(50); - reconSupervisor.ProcessPendingEvents(); } return reinterpret_cast(0); @@ -116,7 +117,7 @@ ReconstructorSupervisor::ReconstructorSupervisor (SupervisorThread* pThread, Pro BackgroundSupervisor (pThread, pProjView->GetFrame(), pProjView->GetDocument(), "Reconstructing", pProjView->GetDocument()->getProjections().nView()) { m_vecpChildImageFile.reserve (getNumWorkers()); - for (unsigned int iThread = 0; iThread < getNumWorkers(); iThread++) { + for (int iThread = 0; iThread < getNumWorkers(); iThread++) { m_vecpChildImageFile[iThread] = new ImageFile (m_iImageNX, m_iImageNY); } @@ -148,28 +149,19 @@ ReconstructorSupervisor::onDone() wxCriticalSectionLocker critsect (doneSection); ImageFile* pImageFile = getImageFile(); - - wxMutexGuiEnter(); - ImageFileDocument* pReconDoc = theApp->newImageDoc(); - if (! pReconDoc) { - sys_error (ERR_SEVERE, "Unable to create image file"); - return; - } - pReconDoc->setImageFile (pImageFile); - pReconDoc->UpdateAllViews (m_pProjView); - if (ImageFileView* rasterView = pReconDoc->getView()) { - rasterView->OnUpdate (rasterView, NULL); - rasterView->getFrame()->SetFocus(); - rasterView->getFrame()->Show(true); - } - *theApp->getLog() << m_pszLabel << "\n"; - wxMutexGuiLeave(); - - if (theApp->getAskDeleteNewDocs()) - pReconDoc->Modify (true); pImageFile->labelAdd (m_pProjView->GetDocument()->getProjections().getLabel()); pImageFile->labelAdd (m_pszLabel, getTimerEnd()); + wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT ); + wxString msg (m_pszLabel); + msg += "\n"; + eventLog.SetString( msg ); + wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event + + wxCommandEvent newImageEvent (wxEVT_COMMAND_MENU_SELECTED, NEW_IMAGEFILE_EVENT); + newImageEvent.SetClientData (pImageFile); + wxPostEvent (theApp->getMainFrame(), newImageEvent); + setDone(); } @@ -225,12 +217,12 @@ ReconstructorWorker::Entry () m_pszFilterGenerationName, m_pszInterpName, m_iInterpParam, m_pszBackprojectName, Trace::TRACE_NONE); bool bFail = pReconstructor->fail(); - wxString failMsg; + std::string failMsg; if (bFail) { failMsg = "Unable to make reconstructor: "; failMsg += pReconstructor->failMessage().c_str(); wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT ); - event.SetString( failMsg ); + event.SetString( failMsg.c_str() ); wxPostEvent( theApp->getMainFrame(), event ); } else @@ -250,21 +242,16 @@ ReconstructorWorker::Entry () break; } pReconstructor->reconstructView (iUnit + m_iStartUnit, 1); - m_pSupervisor->AddPendingEvent (eventProgress); + m_pSupervisor->onWorkerUnitTick(); } pReconstructor->postProcessing(); } delete pReconstructor; if (bFail) { - wxCommandEvent eventFail (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_WORKER_THREAD_FAIL); - eventFail.SetInt (m_iThread); // Send back thread# that has finished - eventFail.SetString (failMsg); - wxPostEvent (m_pSupervisor, eventFail); + m_pSupervisor->onWorkerFail (m_iThread, failMsg); } else { - wxCommandEvent eventDone (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_WORKER_THREAD_DONE); - eventDone.SetInt (m_iThread); // Send back thread# that has finished - wxPostEvent (m_pSupervisor, eventDone); + m_pSupervisor->onWorkerDone (m_iThread); } while (! TestDestroy())