** This is part of the CTSim program
** Copyright (C) 1983-2001 Kevin Rosenberg
**
-** $Id: threadrecon.cpp,v 1.14 2001/02/27 03:59:30 kevin Exp $
+** $Id: threadrecon.cpp,v 1.22 2001/03/07 21:18:50 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
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
******************************************************************************/
+
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "backgroundmgr.h"
#include "backgroundsupr.h"
-#if defined(HAVE_CONFIG_H)
-#include "config.h"
-#endif
+#ifdef HAVE_WXTHREADS
+
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())
{
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<wxThread::ExitCode>(0);
+ return static_cast<wxThread::ExitCode>(0);
}
void
int iImageNX, int iImageNY, const char* pszFilterName, double dFilterParam, const char* pszFilterMethod,
int iZeropad, const char* pszFilterGenerationName, const char* pszInterpName, int iInterpParam,
const char* pszBackprojectName, const char* const pszLabel)
- : m_pProjView(pProjView), m_pProjDoc(pProjView->GetDocument()),
+ : BackgroundSupervisor (pThread, pProjView->GetFrame(), pProjView->GetDocument(), "Reconstructing", pProjView->GetDocument()->getProjections().nView()),
+ m_pProjView(pProjView), m_pProjDoc(pProjView->GetDocument()),
m_iImageNX(iImageNX), m_iImageNY(iImageNY),
m_pszFilterName(pszFilterName), m_dFilterParam(dFilterParam), m_pszFilterMethod(pszFilterMethod),
m_iZeropad(iZeropad), m_pszFilterGenerationName(pszFilterGenerationName), m_pszInterpName(pszInterpName),
- m_iInterpParam(iInterpParam), m_pszBackprojectName(pszBackprojectName), m_pszLabel(pszLabel),
- BackgroundSupervisor (pThread, pProjView->GetFrame(), pProjView->GetDocument(), "Reconstructing", pProjView->GetDocument()->getProjections().nView())
+ m_iInterpParam(iInterpParam), m_pszBackprojectName(pszBackprojectName), m_pszLabel(pszLabel)
{
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);
}
wxCriticalSection doneSection;
wxCriticalSectionLocker critsect (doneSection);
- ImageFileDocument* pReconDoc = theApp->newImageDoc();
- if (! pReconDoc) {
- sys_error (ERR_SEVERE, "Unable to create image file");
- return;
- }
-
ImageFile* pImageFile = getImageFile();
- pReconDoc->setImageFile (pImageFile);
- if (theApp->getAskDeleteNewDocs())
- pReconDoc->Modify (true);
- 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";
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();
}
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
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())
ReconstructorWorker::OnExit ()
{
}
+
+#endif // HAVE_WXTHREADS