X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fthreadproj.cpp;h=60931a9117a4890dc3632adb8bf4f75b6a9e6bb2;hp=db6070c1484a8a5b12bd92ddc9fb228556aca137;hb=f7ee98f7d964ed361068179f0e7ea4475ed1abdf;hpb=4d5f56994972346351a48730315a7d85924103ba diff --git a/src/threadproj.cpp b/src/threadproj.cpp index db6070c..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.3 2001/02/25 16:21:36 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 @@ -31,6 +31,10 @@ #include "wx/wx.h" #endif +#if defined(HAVE_CONFIG_H) +#include "config.h" +#endif + #include "ct.h" #include "ctsim.h" #include "docs.h" @@ -39,9 +43,8 @@ #include "backgroundmgr.h" #include "backgroundsupr.h" -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif +#ifdef HAVE_WXTHREADS + @@ -51,43 +54,40 @@ // ///////////////////////////////////////////////////////////////////// -ProjectorSupervisorThread::ProjectorSupervisorThread (PhantomFileView* pProjView, int iNDet, int iNView, - const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dViewRatio, - double dScanRatio, const char* const pszLabel) -: m_pPhantomView(pProjView), m_iNDet(iNDet), m_iNView(iNView), m_strGeometry(pszGeometry), - m_iNSample(iNSample), m_dRotation(dRotation), m_dFocalLength(dFocalLength), m_dViewRatio(dViewRatio), - m_dScanRatio(dScanRatio), m_strLabel(pszLabel), - SupervisorThread() +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, 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) { } wxThread::ExitCode ProjectorSupervisorThread::Entry() { - ProjectorSupervisor projSupervisor (m_pPhantomView, m_iNDet, m_iNView, - m_strGeometry.c_str(), m_iNSample, m_dRotation, m_dFocalLength, 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()) { - Sleep(50); - Yield(); + while (! projSupervisor.workersDone() && ! projSupervisor.fail() && ! projSupervisor.cancelled()) { + Sleep(100); } 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 @@ -102,21 +102,21 @@ ProjectorSupervisorThread::OnExit() // ///////////////////////////////////////////////////////////////////// -ProjectorSupervisor::ProjectorSupervisor (PhantomFileView* pPhantomView, int iNDet, int iNView, - const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dViewRatio, - double dScanRatio, const char* const pszLabel) - : 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_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_pszLabel(pszLabel), - BackgroundSupervisor (pPhantomView->GetFrame(), pPhantomView->GetDocument(), "Projecting", 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, 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_dViewRatio, m_dScanRatio); + m_iNView, m_iOffsetView, m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio); m_vecpChildProjections.reserve (getNumWorkers()); - for (unsigned int iThread = 0; iThread < getNumWorkers(); iThread++) { - m_vecpChildProjections[iThread] = new Projections (*m_pScanner); + for (int iThread = 0; iThread < getNumWorkers(); iThread++) { + m_vecpChildProjections[iThread] = new Projections (*m_pScanner); } @@ -138,8 +138,8 @@ 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, - m_pszGeometry, m_iNSample, m_dRotation, m_dFocalLength, m_dViewRatio, m_dScanRatio); + 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; } @@ -150,26 +150,20 @@ ProjectorSupervisor::onDone() wxCriticalSection doneSection; wxCriticalSectionLocker critsect (doneSection); - ProjectionFileDocument* pProjDoc = theApp->newProjectionDoc(); - if (! pProjDoc) { - sys_error (ERR_SEVERE, "Unable to create projection file"); - return; - } - Projections* pProjections = getProjections(); - pProjDoc->setProjections (pProjections); - if (theApp->getAskDeleteNewDocs()) - pProjDoc->Modify (true); - pProjDoc->UpdateAllViews (NULL); - if (ProjectionFileView* projView = pProjDoc->getView()) { - projView->OnUpdate (projView, NULL); - projView->getFrame()->SetFocus(); - projView->getFrame()->Show(true); - } - *theApp->getLog() << m_pszLabel << "\n"; - 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_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(); } @@ -184,12 +178,11 @@ ProjectorSupervisor::getProjections() for (int iw = 0; iw < getNumWorkers(); iw++) { for (int iView = 0; iView < m_vecpChildProjections[iw]->nView(); iView++) { DetectorArray& childDetArray = m_vecpChildProjections[iw]->getDetectorArray(iView); - DetectorArray& globalDetArray = pProjections->getDetectorArray(iGlobalView); + DetectorArray& globalDetArray = pProjections->getDetectorArray(iGlobalView++); globalDetArray.setViewAngle (childDetArray.viewAngle()); DetectorValue* childDetval = childDetArray.detValues(); DetectorValue* globalDetval = globalDetArray.detValues(); memcpy (globalDetval, childDetval, detArraySize); - iGlobalView++; } } @@ -205,9 +198,9 @@ ProjectorSupervisor::getProjections() void ProjectorWorker::SetParameters (PhantomFileView* pPhantomView, Projections* pProjections, Scanner* pScanner, - int iNDet, int iView, - const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dViewRatio, - double dScanRatio) + int iNDet, int iView, int iOffsetView, + const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength, + double dViewRatio, double dScanRatio) { m_pScanner = pScanner; m_pPhantomView = pPhantomView; @@ -215,6 +208,7 @@ ProjectorWorker::SetParameters (PhantomFileView* pPhantomView, Projections* pPro m_pszGeometry = pszGeometry; m_iNSample = iNSample; m_dFocalLength = dFocalLength; + m_dCenterDetectorLength = dCenterDetectorLength; m_dViewRatio = dViewRatio; m_dScanRatio = dScanRatio; } @@ -226,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 @@ -240,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()) @@ -274,3 +264,5 @@ void ProjectorWorker::OnExit () { } + +#endif // HAVE_WXTHREADS