r617: *** empty log message ***
[ctsim.git] / src / threadproj.cpp
index b2d169f11ef77c5964f772fb801879a6d6e0d1f1..f967269df76a1a7b23fe64e64737569247c4ec55 100644 (file)
@@ -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: threadproj.cpp,v 1.15 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
@@ -70,9 +70,8 @@ ProjectorSupervisorThread::Entry()
    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()) {
+  while (! projSupervisor.workersDone() && ! projSupervisor.fail() && ! projSupervisor.cancelled()) {
     Sleep(100);
-    Yield();
   }
   if (projSupervisor.fail())
   {
@@ -84,12 +83,11 @@ ProjectorSupervisorThread::Entry()
     wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event
   }
 
-  while (! projSupervisor.workersDeleted()) {
-    Sleep(50);
-    projSupervisor.ProcessPendingEvents();
-  }
+  if (! projSupervisor.cancelled())
+         projSupervisor.onDone();
+  projSupervisor.deleteWorkers();
 
-  return reinterpret_cast<wxThread::ExitCode>(0);
+  return static_cast<wxThread::ExitCode>(0);
 }
 
 void
@@ -220,12 +218,12 @@ ProjectorWorker::Entry ()
 {
   const Phantom& rPhantom = m_pPhantomView->GetDocument()->getPhantom();
   bool bFail = m_pScanner->fail();
-  wxString failMsg;
+  std::string failMsg;
   if (bFail) {
       failMsg = "Unable to make Projector: ";
       failMsg += m_pScanner->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
@@ -245,19 +243,14 @@ ProjectorWorker::Entry ()
         break;
       }
       m_pScanner->collectProjections (*m_pProjections, rPhantom, iUnit + m_iStartUnit, 1, iUnit, Trace::TRACE_NONE);
-      wxPostEvent (m_pSupervisor, eventProgress);
+      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())