Applied initial patches for wx2.8 compatibility
[ctsim.git] / src / threadproj.cpp
index c4fa9aeabdbad87ae5b86a1c03bc09b4f90abd7c..60931a9117a4890dc3632adb8bf4f75b6a9e6bb2 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2001 Kevin Rosenberg
 **
-**  $Id: threadproj.cpp,v 1.6 2001/03/01 07:30:49 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
 #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
+
 
 
 
 //
 /////////////////////////////////////////////////////////////////////
 
-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)
-: m_pPhantomView(pProjView), m_iNDet(iNDet), m_iNView(iNView), m_strGeometry(pszGeometry), 
+   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),
-  SupervisorThread()
+  m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_strLabel(pszLabel)
 {
 }
 
 wxThread::ExitCode
 ProjectorSupervisorThread::Entry()
 {
-  ProjectorSupervisor projSupervisor (this, m_pPhantomView, m_iNDet, m_iNView, 
-   m_strGeometry.c_str(), m_iNSample, m_dRotation, m_dFocalLength, m_dCenterDetectorLength, 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()) {
+  while (! projSupervisor.workersDone() && ! projSupervisor.fail() && ! projSupervisor.cancelled()) {
     Sleep(100);
-    Yield();
   }
   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<wxThread::ExitCode>(0);
+  return static_cast<wxThread::ExitCode>(0);
 }
 
 void
@@ -102,21 +102,21 @@ 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)
-    : 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_dCenterDetectorLength(dCenterDetectorLength), m_dViewRatio(dViewRatio), m_dScanRatio(dScanRatio), m_pszLabel(pszLabel), 
-      BackgroundSupervisor (pThread, pPhantomView->GetFrame(), pPhantomView->GetDocument(), "Projecting", iNView)
+   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_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 (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,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;
@@ -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();
 }
 
@@ -204,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)
 {
@@ -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