r604: no message
[ctsim.git] / src / threadproj.cpp
index b2d169f11ef77c5964f772fb801879a6d6e0d1f1..9927d0be17411c0aa429111c6b0497ef7a379b90 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.13 2001/03/04 22:30:20 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,9 +83,12 @@ ProjectorSupervisorThread::Entry()
     wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event
   }
 
+  if (! projSupervisor.cancelled())
+         projSupervisor.onDone();
+  projSupervisor.deleteWorkers();
+
   while (! projSupervisor.workersDeleted()) {
     Sleep(50);
-    projSupervisor.ProcessPendingEvents();
   }
 
   return reinterpret_cast<wxThread::ExitCode>(0);
@@ -220,12 +222,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 +247,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())