r7061: initial property settings
[ctsim.git] / src / threadproj.cpp
index 9927d0be17411c0aa429111c6b0497ef7a379b90..57f08b8d710c5595378309fe0c622f0858715bc5 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2001 Kevin Rosenberg
 **
-**  $Id: threadproj.cpp,v 1.13 2001/03/04 22:30:20 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
 //
 /////////////////////////////////////////////////////////////////////
 
-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), 
+: 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,7 +66,7 @@ ProjectorSupervisorThread::ProjectorSupervisorThread (PhantomFileView* pProjView
 wxThread::ExitCode
 ProjectorSupervisorThread::Entry()
 {
-  ProjectorSupervisor projSupervisor (this, m_pPhantomView, m_iNDet, m_iNView, 
+  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.c_str());
 
   projSupervisor.start();
@@ -87,11 +87,7 @@ ProjectorSupervisorThread::Entry()
          projSupervisor.onDone();
   projSupervisor.deleteWorkers();
 
-  while (! projSupervisor.workersDeleted()) {
-    Sleep(50);
-  }
-
-  return reinterpret_cast<wxThread::ExitCode>(0);
+  return static_cast<wxThread::ExitCode>(0);
 }
 
 void
@@ -106,17 +102,17 @@ 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_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_pszLabel(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++) {
@@ -142,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;
@@ -202,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)
 {
@@ -246,7 +242,8 @@ ProjectorWorker::Entry ()
 #endif
         break;
       }
-      m_pScanner->collectProjections (*m_pProjections, rPhantom, iUnit + m_iStartUnit, 1, iUnit, Trace::TRACE_NONE);
+      m_pScanner->collectProjections (*m_pProjections, rPhantom, iUnit + m_iStartUnit, 1, 
+        m_iOffsetView, iUnit, Trace::TRACE_NONE);
       m_pSupervisor->onWorkerUnitTick();
     }
   }