X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fthreadproj.cpp;h=60931a9117a4890dc3632adb8bf4f75b6a9e6bb2;hp=b2d169f11ef77c5964f772fb801879a6d6e0d1f1;hb=f7ee98f7d964ed361068179f0e7ea4475ed1abdf;hpb=e98a8a9d72a7b919debbbc9d1b0f237fe71c0fb3 diff --git a/src/threadproj.cpp b/src/threadproj.cpp index b2d169f..60931a9 100644 --- a/src/threadproj.cpp +++ b/src/threadproj.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2001 Kevin Rosenberg ** -** $Id: threadproj.cpp,v 1.12 2001/03/04 04:30:45 kevin Exp $ +** $Id$ ** ** 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 @@ -54,10 +54,10 @@ // ///////////////////////////////////////////////////////////////////// -ProjectorSupervisorThread::ProjectorSupervisorThread (PhantomFileView* pProjView, int iNDet, int iNView, +ProjectorSupervisorThread::ProjectorSupervisorThread (PhantomFileView* pProjView, int iNDet, int iNView, int iOffsetView, const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength, - double dViewRatio, double dScanRatio, const char* const pszLabel) -: SupervisorThread(), m_pPhantomView(pProjView), m_iNDet(iNDet), m_iNView(iNView), m_strGeometry(pszGeometry), + double dViewRatio, double dScanRatio, wxChar const* pszLabel) +: SupervisorThread(), m_pPhantomView(pProjView), m_iNDet(iNDet), m_iNView(iNView), m_iOffsetView(iOffsetView), m_strGeometry(pszGeometry), m_iNSample(iNSample), m_dRotation(dRotation), m_dFocalLength(dFocalLength), m_dCenterDetectorLength(dCenterDetectorLength), m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_strLabel(pszLabel) { @@ -66,30 +66,28 @@ ProjectorSupervisorThread::ProjectorSupervisorThread (PhantomFileView* pProjView wxThread::ExitCode ProjectorSupervisorThread::Entry() { - ProjectorSupervisor projSupervisor (this, m_pPhantomView, m_iNDet, m_iNView, - m_strGeometry.c_str(), m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio, m_strLabel.c_str()); + ProjectorSupervisor projSupervisor (this, m_pPhantomView, m_iNDet, m_iNView, m_iOffsetView, + m_strGeometry.c_str(), m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio, m_strLabel); projSupervisor.start(); - while (! projSupervisor.isDone() && ! projSupervisor.fail()) { + while (! projSupervisor.workersDone() && ! projSupervisor.fail() && ! projSupervisor.cancelled()) { Sleep(100); - Yield(); } if (projSupervisor.fail()) { - wxString msg ("Error starting Projector supervisor: "); - msg += projSupervisor.getFailMessage().c_str(); - msg += "\n"; + wxString msg (_T("Error starting Projector supervisor: ")); + msg += projSupervisor.getFailMessage(); + msg += _T("\n"); wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT ); eventLog.SetString( msg ); wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event } - while (! projSupervisor.workersDeleted()) { - Sleep(50); - projSupervisor.ProcessPendingEvents(); - } + if (! projSupervisor.cancelled()) + projSupervisor.onDone(); + projSupervisor.deleteWorkers(); - return reinterpret_cast(0); + return static_cast(0); } void @@ -104,21 +102,21 @@ ProjectorSupervisorThread::OnExit() // ///////////////////////////////////////////////////////////////////// -ProjectorSupervisor::ProjectorSupervisor (SupervisorThread* pThread, PhantomFileView* pPhantomView, int iNDet, int iNView, +ProjectorSupervisor::ProjectorSupervisor (SupervisorThread* pThread, PhantomFileView* pPhantomView, int iNDet, int iNView, int iOffsetView, const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength, - double dViewRatio, double dScanRatio, const char* const pszLabel) - : BackgroundSupervisor (pThread, pPhantomView->GetFrame(), pPhantomView->GetDocument(), "Projecting", iNView), - m_pPhantomView(pPhantomView), m_pPhantomDoc(pPhantomView->GetDocument()), - m_iNDet(iNDet), m_iNView(iNView), m_pszGeometry(pszGeometry), m_iNSample(iNSample), - m_dRotation(dRotation), m_dFocalLength(dFocalLength), m_dCenterDetectorLength(dCenterDetectorLength), - m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_pszLabel(pszLabel) + double dViewRatio, double dScanRatio, wxChar const* pszLabel) + : BackgroundSupervisor (pThread, pPhantomView->GetFrame(), pPhantomView->GetDocument(), _T("Projecting"), iNView), + m_pPhantomView(pPhantomView), m_pPhantomDoc(pPhantomView->GetDocument()), + m_iNDet(iNDet), m_iNView(iNView), m_iOffsetView(iOffsetView), m_pszGeometry(pszGeometry), m_iNSample(iNSample), + m_dRotation(dRotation), m_dFocalLength(dFocalLength), m_dCenterDetectorLength(dCenterDetectorLength), + m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_strLabel(pszLabel) { m_pScanner = new Scanner (m_pPhantomDoc->getPhantom(), m_pszGeometry, m_iNDet, - m_iNView, m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio); + m_iNView, m_iOffsetView, m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio); m_vecpChildProjections.reserve (getNumWorkers()); for (int iThread = 0; iThread < getNumWorkers(); iThread++) { - m_vecpChildProjections[iThread] = new Projections (*m_pScanner); + m_vecpChildProjections[iThread] = new Projections (*m_pScanner); } @@ -140,7 +138,7 @@ ProjectorSupervisor::createWorker (int iThread, int iStartUnit, int iNumUnits) { ProjectorWorker* pThread = new ProjectorWorker (this, iThread, iStartUnit, iNumUnits); m_vecpChildProjections[iThread]->setNView (iNumUnits); - pThread->SetParameters (m_pPhantomView, m_vecpChildProjections[iThread], m_pScanner, m_iNDet, m_iNView, + pThread->SetParameters (m_pPhantomView, m_vecpChildProjections[iThread], m_pScanner, m_iNDet, m_iNView, m_iOffsetView, m_pszGeometry, m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio); return pThread; @@ -153,19 +151,19 @@ ProjectorSupervisor::onDone() wxCriticalSectionLocker critsect (doneSection); Projections* pProjections = getProjections(); - pProjections->setRemark (m_pszLabel); + pProjections->setRemark (m_strLabel.mb_str(wxConvUTF8)); pProjections->setCalcTime (getTimerEnd()); wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT ); - wxString msg (m_pszLabel); - msg += "\n"; + wxString msg (m_strLabel); + msg += _T("\n"); eventLog.SetString( msg ); wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event wxCommandEvent newProjEvent (wxEVT_COMMAND_MENU_SELECTED, NEW_PROJECTIONFILE_EVENT); newProjEvent.SetClientData (pProjections); wxPostEvent (theApp->getMainFrame(), newProjEvent); - + setDone(); } @@ -200,7 +198,7 @@ ProjectorSupervisor::getProjections() void ProjectorWorker::SetParameters (PhantomFileView* pPhantomView, Projections* pProjections, Scanner* pScanner, - int iNDet, int iView, + int iNDet, int iView, int iOffsetView, const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength, double dViewRatio, double dScanRatio) { @@ -222,10 +220,10 @@ ProjectorWorker::Entry () bool bFail = m_pScanner->fail(); wxString failMsg; if (bFail) { - failMsg = "Unable to make Projector: "; - failMsg += m_pScanner->failMessage().c_str(); + failMsg = _T("Unable to make Projector: "); + failMsg += wxConvUTF8.cMB2WX(m_pScanner->failMessage().c_str()); wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT ); - event.SetString( failMsg ); + event.SetString( failMsg ); wxPostEvent( theApp->getMainFrame(), event ); } else @@ -236,28 +234,24 @@ ProjectorWorker::Entry () #ifdef DEBUG if (theApp->getVerboseLogging()) { wxString msg; - msg.Printf("Worker thread: Received destroy message at work unit #%d\n", iUnit); + msg.Printf(_T("Worker thread: Received destroy message at work unit #%d\n"), iUnit); wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT ); event.SetString( msg ); - wxPostEvent( theApp->getMainFrame(), event ); + wxPostEvent( theApp->getMainFrame(), event ); } #endif break; } - m_pScanner->collectProjections (*m_pProjections, rPhantom, iUnit + m_iStartUnit, 1, iUnit, Trace::TRACE_NONE); - wxPostEvent (m_pSupervisor, eventProgress); + m_pScanner->collectProjections (*m_pProjections, rPhantom, iUnit + m_iStartUnit, 1, + m_iOffsetView, iUnit, Trace::TRACE_NONE); + m_pSupervisor->onWorkerUnitTick(); } } 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())