X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fthreadproj.cpp;h=64216562ab82c04d1c5ec401ee30471db3067313;hb=52f2fdc3424cd6b5b77ad1497243e1e06739ffe6;hp=1644eecbf5ec79d1bc04404ea60eeb54aff6b263;hpb=432ba2c487a5320352f14bdd2cce008fccef6902;p=ctsim.git diff --git a/src/threadproj.cpp b/src/threadproj.cpp index 1644eec..6421656 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.5 2001/02/27 03:59:30 kevin Exp $ +** $Id: threadproj.cpp,v 1.7 2001/03/02 21:11: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 @@ -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 + @@ -52,11 +55,11 @@ ///////////////////////////////////////////////////////////////////// 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) + const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength, + 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), + m_iNSample(iNSample), m_dRotation(dRotation), m_dFocalLength(dFocalLength), m_dCenterDetectorLength(dCenterDetectorLength), + m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_strLabel(pszLabel), SupervisorThread() { } @@ -65,7 +68,7 @@ wxThread::ExitCode ProjectorSupervisorThread::Entry() { ProjectorSupervisor projSupervisor (this, m_pPhantomView, m_iNDet, m_iNView, - m_strGeometry.c_str(), m_iNSample, m_dRotation, m_dFocalLength, m_dViewRatio, m_dScanRatio, m_strLabel.c_str()); + m_strGeometry.c_str(), m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio, m_strLabel.c_str()); projSupervisor.start(); while (! projSupervisor.isDone() && ! projSupervisor.fail()) { @@ -103,16 +106,16 @@ ProjectorSupervisorThread::OnExit() ///////////////////////////////////////////////////////////////////// ProjectorSupervisor::ProjectorSupervisor (SupervisorThread* pThread, PhantomFileView* pPhantomView, int iNDet, int iNView, - const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dViewRatio, - double dScanRatio, const char* const pszLabel) + const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength, + 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), + m_dCenterDetectorLength(dCenterDetectorLength), m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_pszLabel(pszLabel), BackgroundSupervisor (pThread, pPhantomView->GetFrame(), pPhantomView->GetDocument(), "Projecting", iNView) { 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_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio); m_vecpChildProjections.reserve (getNumWorkers()); for (unsigned int iThread = 0; iThread < getNumWorkers(); iThread++) { @@ -139,7 +142,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, - m_pszGeometry, m_iNSample, m_dRotation, m_dFocalLength, m_dViewRatio, m_dScanRatio); + m_pszGeometry, m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, m_dViewRatio, m_dScanRatio); return pThread; } @@ -150,16 +153,15 @@ ProjectorSupervisor::onDone() wxCriticalSection doneSection; wxCriticalSectionLocker critsect (doneSection); + Projections* pProjections = getProjections(); + + wxMutexGuiEnter(); 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); @@ -167,6 +169,10 @@ ProjectorSupervisor::onDone() projView->getFrame()->Show(true); } *theApp->getLog() << m_pszLabel << "\n"; + wxMutexGuiLeave(); + + if (theApp->getAskDeleteNewDocs()) + pProjDoc->Modify (true); pProjections->setRemark (m_pszLabel); pProjections->setCalcTime (getTimerEnd()); @@ -205,8 +211,8 @@ 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) + const char* pszGeometry, int iNSample, double dRotation, double dFocalLength, double dCenterDetectorLength, + double dViewRatio, double dScanRatio) { m_pScanner = pScanner; m_pPhantomView = pPhantomView; @@ -214,6 +220,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; } @@ -273,3 +280,5 @@ void ProjectorWorker::OnExit () { } + +#endif // HAVE_WXTHREADS