r576: no message
authorKevin M. Rosenberg <kevin@rosenberg.net>
Fri, 23 Feb 2001 18:56:56 +0000 (18:56 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Fri, 23 Feb 2001 18:56:56 +0000 (18:56 +0000)
msvc/ctsim/ctsim.plg
src/backgroundmgr.cpp
src/backgroundmgr.h
src/docs.cpp
src/docs.h
src/threadrecon.cpp
src/threadrecon.h
src/views.cpp

index c89a66916c26275d1845ceaa102a7fbce5a41024..e4d6f219f6f318679698514e59bb6576cfc24286 100644 (file)
@@ -6,15 +6,7 @@
 --------------------Configuration: ctsim - Win32 Debug--------------------
 </h3>
 <h3>Command Lines</h3>
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8D.tmp" with contents
-[
-/nologo /G6 /MTd /W3 /Gm /Gi /GR /GX /Zi /Od /Gy /I "\wx2.2.5\include" /I "..\..\..\fftw-2.1.3\fftw" /I "\wx2.2.5\src\png" /I "\wx2.2.5\src\zlib" /I "..\..\include" /I "..\..\getopt" /I "..\..\..\fftw-2.1.3\rfftw" /D VERSION=\"3.0.0beta1\" /D "_DEBUG" /D "__WXMSW__" /D "HAVE_SGP" /D "HAVE_PNG" /D "HAVE_WXWINDOWS" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "HAVE_STRING_H" /D "HAVE_FFTW" /D "HAVE_RFFTW" /D "HAVE_GETOPT_H" /D "MSVC" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D CTSIMVERSION=\"3.0.4\" /FR"Debug/" /Fp"Debug/ctsim.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c 
-"C:\ctsim\src\backgroundmgr.cpp"
-"C:\ctsim\src\graph3dview.cpp"
-"C:\ctsim\src\threadrecon.cpp"
-]
-Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8D.tmp" 
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8E.tmp" with contents
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP119.tmp" with contents
 [
 /nologo /G6 /MTd /W3 /Gm /Gi /GR /GX /Zi /Od /Gy /I "\wx2.2.5\include" /I "..\..\..\fftw-2.1.3\fftw" /I "\wx2.2.5\src\png" /I "\wx2.2.5\src\zlib" /I "..\..\include" /I "..\..\getopt" /I "..\..\..\fftw-2.1.3\rfftw" /D VERSION=\"3.0.0beta1\" /D "_DEBUG" /D "__WXMSW__" /D "HAVE_SGP" /D "HAVE_PNG" /D "HAVE_WXWINDOWS" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "HAVE_STRING_H" /D "HAVE_FFTW" /D "HAVE_RFFTW" /D "HAVE_GETOPT_H" /D "MSVC" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D CTSIMVERSION=\"3.0.4\" /D CTSIMVERSION=\"3.0.0alpha5\" /FR"Debug/" /Fp"Debug/ctsim.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c 
 "C:\ctsim\src\ctsim.cpp"
@@ -22,8 +14,14 @@ Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8E.tmp" with content
 "C:\ctsim\src\docs.cpp"
 "C:\ctsim\src\views.cpp"
 ]
-Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8E.tmp" 
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8F.tmp" with contents
+Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP119.tmp" 
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP11A.tmp" with contents
+[
+/nologo /G6 /MTd /W3 /Gm /Gi /GR /GX /Zi /Od /Gy /I "\wx2.2.5\include" /I "..\..\..\fftw-2.1.3\fftw" /I "\wx2.2.5\src\png" /I "\wx2.2.5\src\zlib" /I "..\..\include" /I "..\..\getopt" /I "..\..\..\fftw-2.1.3\rfftw" /D VERSION=\"3.0.0beta1\" /D "_DEBUG" /D "__WXMSW__" /D "HAVE_SGP" /D "HAVE_PNG" /D "HAVE_WXWINDOWS" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "HAVE_STRING_H" /D "HAVE_FFTW" /D "HAVE_RFFTW" /D "HAVE_GETOPT_H" /D "MSVC" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D CTSIMVERSION=\"3.0.4\" /FR"Debug/" /Fp"Debug/ctsim.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c 
+"C:\ctsim\src\threadrecon.cpp"
+]
+Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP11A.tmp" 
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP11B.tmp" with contents
 [
 winmm.lib rpcrt4.lib ws2_32.lib ../libctsim/Debug/libctsim.lib libcmtd.lib ..\..\..\fftw-2.1.3\Win32\FFTW2st\Debug\FFTW2st.lib ..\..\..\fftw-2.1.3\Win32\RFFTW2st\Debug\RFFTW2st.lib wxd.lib xpmd.lib tiffd.lib zlibd.lib pngd.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib htmlhelp.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/ctsim.pdb" /debug /machine:I386 /out:"Debug/ctsim.exe" /pdbtype:sept /libpath:"\wx2.2.5\lib" 
 .\Debug\backgroundmgr.obj
@@ -47,17 +45,15 @@ winmm.lib rpcrt4.lib ws2_32.lib ../libctsim/Debug/libctsim.lib libcmtd.lib ..\..
 \wx2.2.5\lib\zlibd.lib
 \wx2.2.5\lib\tiffd.lib
 ]
-Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP8F.tmp"
+Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP11B.tmp"
 <h3>Output Window</h3>
 Compiling...
-threadrecon.cpp
-backgroundmgr.cpp
-graph3dview.cpp
-Compiling...
 ctsim.cpp
 dialogs.cpp
 docs.cpp
 views.cpp
+Compiling...
+threadrecon.cpp
 Linking...
 
 
index e915624bf7fe00db1bb17b3b7312a168a74170ce..c835b7b744565925b2c369e0daa4319273368fa1 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2001 Kevin Rosenberg
 **
-**  $Id: backgroundmgr.cpp,v 1.3 2001/02/23 02:06:02 kevin Exp $
+**  $Id: backgroundmgr.cpp,v 1.4 2001/02/23 18:56:56 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
@@ -76,7 +76,7 @@ BackgroundManager::OnCloseWindow (wxCloseEvent& event)
 
 
 wxGauge* 
-BackgroundManager::addTask (BackgroundTask* pTask, int iNumUnits, const char* const pszTaskName)
+BackgroundManager::addTask (BackgroundSupervisor* pTask, int iNumUnits, const char* const pszTaskName)
 {
   wxCriticalSectionLocker locker (m_criticalSection);
   int iNumTasks = m_vecpBackgroundTasks.size();
@@ -117,7 +117,7 @@ BackgroundManager::addTask (BackgroundTask* pTask, int iNumUnits, const char* co
 
 
 void 
-BackgroundManager::taskDone (BackgroundTask* pTask)
+BackgroundManager::taskDone (BackgroundSupervisor* pTask)
 {
   wxCriticalSectionLocker locker (m_criticalSection);
 
@@ -166,7 +166,7 @@ BackgroundManager::resizeWindow()
 
 
 bool
-BackgroundManager::isCancelling (BackgroundTask* pTask)
+BackgroundManager::isCancelling (BackgroundSupervisor* pTask)
 {
   return false;
 }
index d3f49a1304541b6f26361559ffe82f3e9865f3b2..90bbf147525182765ccd057b2b161573be394a16 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2001 Kevin Rosenberg
 **
-**  $Id: backgroundmgr.h,v 1.3 2001/02/23 02:06:02 kevin Exp $
+**  $Id: backgroundmgr.h,v 1.4 2001/02/23 18:56:56 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
@@ -63,7 +63,7 @@ private:
   BackgroundManagerCanvas* m_pCanvas;
   int m_iNumTasks;
 
-  typedef std::vector<BackgroundTask*> TaskContainer;
+  typedef std::vector<BackgroundSupervisor*> TaskContainer;
   typedef std::vector<wxGauge*>  GaugeContainer;
   typedef std::vector<std::string*> StringContainer;
   typedef std::vector<int> PositionContainer;
@@ -83,9 +83,9 @@ private:
 public:
   BackgroundManager ();
 
-  wxGauge* addTask (BackgroundTask* pTask, int iNumUnits, const char* const pszTaskName);
-  void taskDone (BackgroundTask* pTask);
-  bool isCancelling (BackgroundTask* pTask);
+  wxGauge* addTask (BackgroundSupervisor* pTask, int iNumUnits, const char* const pszTaskName);
+  void taskDone (BackgroundSupervisor* pTask);
+  bool isCancelling (BackgroundSupervisor* pTask);
 
   TaskContainer& getTasks() { return m_vecpBackgroundTasks;}
   GaugeContainer& getGauges() { return m_vecpGauges;}
index 460082a63ae8f3a14f1e30a1beccb1c322e21352..b356033164193c8a900a84b1d0ed1678895d974e 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: docs.cpp,v 1.25 2001/02/22 11:05:38 kevin Exp $
+**  $Id: docs.cpp,v 1.26 2001/02/23 18:56:56 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
@@ -129,6 +129,10 @@ ImageFileDocument::Revert ()
 // ProjectionFileDocument
 
 IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, wxDocument)
+BEGIN_EVENT_TABLE(ProjectionFileDocument, wxDocument)
+EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_ADD, ProjectionFileDocument::OnAddBackground)
+EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_REMOVE, ProjectionFileDocument::OnRemoveBackground)
+END_EVENT_TABLE()
 
 bool 
 ProjectionFileDocument::OnSaveDocument(const wxString& filename)
@@ -145,31 +149,47 @@ ProjectionFileDocument::OnSaveDocument(const wxString& filename)
 
 ProjectionFileDocument::~ProjectionFileDocument()
 {
-  for (int i = 0; i < m_vecpActiveReconstructors.size(); i++) {
-    ThreadedReconstructor* pThreadedReconstructor = m_vecpActiveReconstructors[i];
-    if (pThreadedReconstructor) {
-      pThreadedReconstructor->cancel();
+  for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); 
+        i != m_vecpBackgroundSupervisors.end(); i++) {
+          (*i)->cancel();
     }
-  }
+  
+  m_vecpBackgroundSupervisors.clear();
+  delete m_pProjectionFile;
+}
+
+void
+ProjectionFileDocument::OnAddBackground (wxCommandEvent& event)
+{
+}
 
-    delete m_pProjectionFile;
+void
+ProjectionFileDocument::OnRemoveBackground (wxCommandEvent& event)
+{
 }
 
 void
-ProjectionFileDocument::addReconstructor (ThreadedReconstructor* pRecon)
+ProjectionFileDocument::addReconstructor (BackgroundSupervisor* pRecon)
 {
   wxCriticalSectionLocker locker (m_criticalSection);
-  m_vecpActiveReconstructors.push_back (pRecon);
+  m_vecpBackgroundSupervisors.push_back (pRecon);
 }
 
 void
-ProjectionFileDocument::removeReconstructor (ThreadedReconstructor* pRecon)
+ProjectionFileDocument::removeReconstructor (BackgroundSupervisor* pRecon)
 {
   wxCriticalSectionLocker locker (m_criticalSection);
-  for (int i = 0; i < m_vecpActiveReconstructors.size(); i++) {
-    if (m_vecpActiveReconstructors[i] == pRecon)
-      m_vecpActiveReconstructors[i] = NULL;
-  }
+  bool bFound = false;
+  for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); 
+        i != m_vecpBackgroundSupervisors.end(); 
+        i++) 
+          if (*i == pRecon) {
+            m_vecpBackgroundSupervisors.erase(i);
+            bFound = true;
+            break;
+        }
+   if (! bFound) 
+     sys_error (ERR_SEVERE, "Could not find background task [ProjectionFileDocument::removeBackgroundTask");
 }
 
 bool 
index 88e362ec694cd4d9112c800d877a1d7c69aae4bc..71ce6e3771eb05de43d1d2912ed5bf6b49aa95bb 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: docs.h,v 1.22 2001/02/22 11:05:38 kevin Exp $
+**  $Id: docs.h,v 1.23 2001/02/23 18:56:56 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
@@ -93,7 +93,9 @@ private:
     DECLARE_DYNAMIC_CLASS(ProjectionFileDocument)
     Projections* m_pProjectionFile;
     bool m_bBadFileOpen;
-    std::vector<ThreadedReconstructor*> m_vecpActiveReconstructors;
+    typedef BackgroundSupervisor BackgroundObject;
+    typedef std::vector<BackgroundObject*> BackgroundContainer ;
+    BackgroundContainer m_vecpBackgroundSupervisors;
     wxCriticalSection m_criticalSection;
     
 public:
@@ -121,8 +123,14 @@ public:
     ProjectionFileView* getView() const;
     bool getBadFileOpen() const { return m_bBadFileOpen; }
     void setBadFileOpen() { m_bBadFileOpen = true; }
-    void addReconstructor (ThreadedReconstructor* pRecon);
-    void removeReconstructor (ThreadedReconstructor* pRecon);
+
+    void OnAddBackground (wxCommandEvent& event);
+    void OnRemoveBackground (wxCommandEvent& event);
+
+    void addReconstructor (BackgroundSupervisor* pRecon);
+    void removeReconstructor (BackgroundSupervisor* pRecon);
+
+    DECLARE_EVENT_TABLE()
 };
 
 
index 159e9d43975749c2e1ad154c54203150e236238e..03d4d39d37987dd4bbc18277f0c2d6f07b65d614 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2001 Kevin Rosenberg
 **
-**  $Id: threadrecon.cpp,v 1.5 2001/02/23 03:28:26 kevin Exp $
+**  $Id: threadrecon.cpp,v 1.6 2001/02/23 18:56:56 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
 #endif
 
 
-IMPLEMENT_DYNAMIC_CLASS(ThreadedReconstructor, BackgroundTask)
-BEGIN_EVENT_TABLE(ThreadedReconstructor, BackgroundTask)
-EVT_MENU(RECONSTRUCTION_THREAD_EVENT, ThreadedReconstructor::OnThreadEvent)
+IMPLEMENT_DYNAMIC_CLASS(ReconstructorSupervisor, BackgroundSupervisor)
+BEGIN_EVENT_TABLE(ReconstructorSupervisor, BackgroundSupervisor)
+EVT_MENU(RECONSTRUCTION_THREAD_EVENT, ReconstructorSupervisor::OnThreadEvent)
+EVT_MENU(MSG_WORKER_THREAD_FAIL, ReconstructorSupervisor::OnWorkerFail)
+EVT_MENU(MSG_WORKER_THREAD_DONE, ReconstructorSupervisor::OnWorkerDone)
+EVT_MENU(MSG_WORKER_THREAD_UNIT_TICK, ReconstructorSupervisor::OnWorkerUnitTick)
 END_EVENT_TABLE()
 
 
-enum {
-  RTHREAD_UNIT_COMPLETE = -1,
-    RTHREAD_THREAD_DONE = -2,
-    RTHREAD_THREAD_CANCELLED = -3,
-};
-
-ThreadedReconstructor::ThreadedReconstructor (ProjectionFileView* pProjView, 
+ReconstructorSupervisor::ReconstructorSupervisor (ProjectionFileView* pProjView, 
                                               int iImageNX, int iImageNY, const char* pszFilterName, double dFilterParam, const char* pszFilterMethod, 
                                               int iZeropad, const char* pszFilterGenerationName, const char* pszInterpName, int iInterpParam,
                                               const char* pszBackprojectName, const char* const pszLabel)
                                               : m_pProjView(pProjView), m_pDialogProgress(NULL), m_pGauge(NULL), m_bFail(false), m_iNumThreads(0), m_iImageNX(iImageNX), 
                                               m_iImageNY(iImageNY), m_strLabel(pszLabel), m_pTimer(NULL), m_bCancelled(false), m_bCancelling(false), 
-                                              BackgroundTask()
+                                              BackgroundSupervisor()
 {
   m_iNumThreads = theApp->getNumberCPU();
   //  ++m_iNumThreads;
@@ -79,7 +76,7 @@ ThreadedReconstructor::ThreadedReconstructor (ProjectionFileView* pProjView,
     int iNumViews = iBaseViews;
     if (iProc < iExtraViews)
       ++iNumViews;
-      m_vecpThread[iProc] = new ReconstructionThread (this, pProjView, m_vecpChildImageFile[iProc], iProc, iStartView, iNumViews,
+      m_vecpThread[iProc] = new ReconstructorWorker (this, pProjView, m_vecpChildImageFile[iProc], iProc, iStartView, iNumViews,
       pszFilterName, dFilterParam, pszFilterMethod, iZeropad, pszFilterGenerationName, pszInterpName, iInterpParam, pszBackprojectName);
     if (m_vecpThread[iProc]->Create () != wxTHREAD_NO_ERROR) {
       m_bFail = true;
@@ -91,7 +88,7 @@ ThreadedReconstructor::ThreadedReconstructor (ProjectionFileView* pProjView,
 
 
 bool
-ThreadedReconstructor::start()
+ReconstructorSupervisor::start()
 {
   if (m_bFail)
     return false;
@@ -120,7 +117,7 @@ ThreadedReconstructor::start()
 }
 
 void
-ThreadedReconstructor::cancel()
+ReconstructorSupervisor::cancel()
 {
   if (isDone() || m_bCancelled)
     return;
@@ -130,18 +127,20 @@ ThreadedReconstructor::cancel()
 }
 
 void
-ThreadedReconstructor::cleanUp()
+ReconstructorSupervisor::cleanUp()
 {
   wxCriticalSection cleanSection;
   cleanSection.Enter();
   
+  m_critsectThreadContainer.Enter();
   for (int i = 0; i < m_iNumThreads; i++) 
     if (m_vecpThread[i] && m_vecpThread[i]->IsRunning()) {
       m_vecpThread[i]->Pause();
       m_vecpThread[i]->Delete();
     }
+  m_critsectThreadContainer.Leave();
     
-    for (i = 0; i < m_iNumThreads; i++) {
+  for (i = 0; i < m_iNumThreads; i++) {
       delete m_vecpChildImageFile[i];
       m_vecpChildImageFile[i] = NULL;
     }    
@@ -160,7 +159,7 @@ ThreadedReconstructor::cleanUp()
 }
 
 void
-ThreadedReconstructor::onDone()
+ReconstructorSupervisor::onDone()
 {
   wxCriticalSection doneSection;
   doneSection.Enter();
@@ -191,21 +190,9 @@ ThreadedReconstructor::onDone()
   cleanUp();
 }
 
-
 void
-ThreadedReconstructor::OnThreadEvent (wxCommandEvent& event)
+ReconstructorSupervisor::OnWorkerUnitTick (wxCommandEvent& event)
 {
-  if (isDone())
-    return;
-  wxCriticalSection eventSection;
-  eventSection.Enter();
-  if (isDone()) {
-    eventSection.Leave();
-    return;
-  }
-  
-  int iEventId = event.GetInt();
-  if (iEventId == RTHREAD_UNIT_COMPLETE) {
     ++m_iViewsDone;
     
 #ifdef DEBUG
@@ -217,33 +204,66 @@ ThreadedReconstructor::OnThreadEvent (wxCommandEvent& event)
       m_bCancelling = ! m_pDialogProgress->Update (m_iViewsDone - 1);
     else if (m_pGauge) {
       m_pGauge->SetValue (m_iViewsDone - 1); 
-      eventSection.Leave();
       m_bCancelling = theApp->getBackgroundManager()->isCancelling(this);
     }
     if (! isDone() && m_bCancelling) {
-      eventSection.Leave();
       cancel();
       return;
     }
-  } 
-  else if (event.GetInt() >= 0) {
-    m_iRunning--;
-    m_vecpThread[event.GetInt()] = NULL;
-    *theApp->getLog() << "Thread finished. Remaining threads: " << m_iRunning << "\n";
-    if (m_iRunning <= 0) {
-      eventSection.Leave();
-      onDone();
-      return;
-    }
+}
+
+void
+ReconstructorSupervisor::OnWorkerDone (wxCommandEvent& event)
+{
+  if (isDone())
+    return;
+
+  m_iRunning--;
+  m_critsectThreadContainer.Enter();
+  m_vecpThread[event.GetInt()] = NULL;
+  m_critsectThreadContainer.Leave();
+  wxString msg;
+  msg.Printf("Reconstructor Supervisor: Thread finished. Remaining threads: %d\n", m_iRunning);  
+  wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
+  eventLog.SetString( msg );
+  wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event
+
+  if (m_iRunning <= 0) {
+    onDone();
+    return;
   }
-  else
-    *theApp->getLog() << "Got event #" << iEventId << "\n";
-  
-  eventSection.Leave();
+}
+
+void
+ReconstructorSupervisor::OnWorkerFail (wxCommandEvent& event)
+{
+  if (isDone())
+    return;
+
+  m_iRunning--;
+  m_critsectThreadContainer.Enter();
+  m_vecpThread[event.GetInt()] = NULL;
+  m_critsectThreadContainer.Leave();
+  wxCommandEvent eventLog( wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
+  eventLog.SetString( event.GetString() );
+  wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event
+
+  onDone();
+}
+
+
+void
+ReconstructorSupervisor::OnThreadEvent (wxCommandEvent& event)
+{
+      wxString msg;
+      msg.Printf("Reconstructor Supervisor: Received event #%d\n", event.GetInt());  
+      wxCommandEvent eventLog( wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
+      eventLog.SetString( msg );
+      wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event
 }
 
 ImageFile*
-ThreadedReconstructor::getImageFile()
+ReconstructorSupervisor::getImageFile()
 {
   ImageFile* pImageFile = new ImageFile (m_iImageNX, m_iImageNY);
   pImageFile->arrayDataClear();
@@ -261,59 +281,73 @@ ThreadedReconstructor::getImageFile()
 }
 
 bool
-ThreadedReconstructor::testDone()
+ReconstructorSupervisor::testDone()
 {
   return (m_iRunning <= 0 ? true : false);
 }
 
 
-ThreadedReconstructor::~ThreadedReconstructor()
+ReconstructorSupervisor::~ReconstructorSupervisor()
 {
 }
 
 
-ReconstructionThread::ReconstructionThread 
-(ThreadedReconstructor* pSupervisor, ProjectionFileView* pProjView, ImageFile* pImageFile, int iThread, int iStartView, int iNumViews, 
+ReconstructorWorker::ReconstructorWorker 
+(ReconstructorSupervisor* pSupervisor, ProjectionFileView* pProjView, ImageFile* pImageFile, int iThread, int iStartView, int iNumViews, 
                                             const char* pszFilterName, double dFilterParam, const char* pszFilterMethod, 
                                             int iZeropad, const char* pszFilterGenerationName, const char* pszInterpName, int iInterpParam,
                                             const char* pszBackprojectName)
-                                            : m_pSupervisor(pSupervisor), 
-                                            m_iStartView(iStartView), m_iNumViews(iNumViews), m_iThread(iThread), 
-                                            wxThread(wxTHREAD_DETACHED)
+    : m_pSupervisor(pSupervisor), m_iStartView(iStartView), m_iNumViews(iNumViews), m_iThread(iThread), 
+    m_pProjView(pProjView), m_pImageFile(pImageFile), m_strFilterName(pszFilterName), m_dFilterParam(dFilterParam), m_strFilterMethod(pszFilterMethod),
+    m_iZeropad(iZeropad), m_strFilterGenerationName(pszFilterGenerationName), m_strInterpName(pszInterpName),
+    m_iInterpParam(iInterpParam), m_strBackprojectName(pszBackprojectName),
+    wxThread(wxTHREAD_DETACHED)
 {
-  m_pReconstructor = new Reconstructor (pProjView->GetDocument()->getProjections(), 
-    *pImageFile, pszFilterName, dFilterParam, pszFilterMethod, iZeropad, pszFilterGenerationName, 
-    pszInterpName, iInterpParam, pszBackprojectName, Trace::TRACE_NONE);
 }
 
 wxThread::ExitCode
-ReconstructionThread::Entry ()
+ReconstructorWorker::Entry ()
 {
-  wxCommandEvent eventProgress (wxEVT_COMMAND_MENU_SELECTED, RECONSTRUCTION_THREAD_EVENT);
+  Reconstructor* pReconstructor = new Reconstructor (m_pProjView->GetDocument()->getProjections(), 
+    *m_pImageFile, m_strFilterName.c_str(), m_dFilterParam, m_strFilterMethod.c_str(), m_iZeropad, 
+    m_strFilterGenerationName.c_str(), m_strInterpName.c_str(), m_iInterpParam, m_strBackprojectName.c_str(), Trace::TRACE_NONE);
+  if (pReconstructor->fail()) {
+      wxString msg;
+      msg.Printf("Unable to make reconstructor: %s", pReconstructor->failMessage());  
+      wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_WORKER_THREAD_FAIL );
+      event.SetString( msg );
+      wxPostEvent( theApp->getMainFrame(), event ); // send in a thread-safe way
+      return reinterpret_cast<wxThread::ExitCode>(-1);
+  }
+
+  wxCommandEvent eventProgress (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_WORKER_THREAD_UNIT_TICK);
 
   for (int iView = 0; iView < m_iNumViews; iView++) {
     if (TestDestroy()) {
+#ifdef DEBUG
       wxString msg;
-      msg.Printf("TestDestroy TRUE at view #%d\n", iView);  
+      msg.Printf("Received destroy message view #%d\n", iView);  
       wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
       event.SetString( msg );
       wxPostEvent( theApp->getMainFrame(), event ); // send in a thread-safe way
-      return reinterpret_cast<wxThread::ExitCode>(RTHREAD_THREAD_CANCELLED);
+#endif
+      delete pReconstructor;
+      return reinterpret_cast<wxThread::ExitCode>(-1);
     }
-    m_pReconstructor->reconstructView (iView + m_iStartView, 1);
-    eventProgress.SetInt (RTHREAD_UNIT_COMPLETE);
+    pReconstructor->reconstructView (iView + m_iStartView, 1);
     wxPostEvent (m_pSupervisor, eventProgress);
   }
-  m_pReconstructor->postProcessing();
+  pReconstructor->postProcessing();
   
+  wxCommandEvent eventDone (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_WORKER_THREAD_DONE);
   eventProgress.SetInt (m_iThread); // Send back thread# that has finished
-  wxPostEvent (m_pSupervisor, eventProgress);
+  wxPostEvent (m_pSupervisor, eventDone);
   
+  delete pReconstructor;
   return reinterpret_cast<wxThread::ExitCode>(0);
 }
 
 void
-ReconstructionThread::OnExit ()
+ReconstructorWorker::OnExit ()
 {
-   delete m_pReconstructor;
 }
index 0daa6219587c2571de2cd729d15b134ff4d732c1..9c1e5e26783b274ca43eabfe13cf579049555c41 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2001 Kevin Rosenberg
 **
-**  $Id: threadrecon.h,v 1.5 2001/02/23 03:28:26 kevin Exp $
+**  $Id: threadrecon.h,v 1.6 2001/02/23 18:56:56 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
 #include <wx/progdlg.h>
 #include "timer.h"
 
-// This thread creates a BackgroundTask event handler object
-// The thread is detached and terminates when BackgroundTask terminates
-class BackgroundTaskThread : public wxThread {
+// This thread creates a SupervisorTask event handler object
+// The thread is detached and terminates when SupervisorTask terminates
+class SupervisorTaskThread : public wxThread {
 private:
 
 public:
-  BackgroundTaskThread();
+  SupervisorTaskThread();
 
-  virtual wxThread::ExitCode Entry();
+  virtual wxThread::ExitCode Entry() = 0;
 
   // called when the thread exits - whether it terminates normally or is stopped with Delete()
   virtual void OnExit();
 };
 
 
-// Pure virtual class for BackgroundTasks that can communication
-// with BackgroundManager
+class ReconstructorSupervisorThread : public SupervisorTaskThread {
+private:
+public:
+};
 
-class BackgroundTask : public wxEvtHandler {
+
+// Pure virtual class for BackgroundSupervisor that can communication
+// with BackgroundManager via messages
+
+class BackgroundSupervisor : public wxEvtHandler {
 private:
   bool m_bDone;
 
 public:
-  BackgroundTask()
+
+  enum {
+    MSG_BACKGROUND_SUPERVISOR_ADD = 7500, // sends to BackgroundManager and Document
+    MSG_BACKGROUND_SUPERVISOR_REMOVE = 7501, // sends to BackgroundManager and Document
+    MSG_BACKGROUND_SUPERVISOR_UNIT_TICK = 7502,  // sends to BackgroundManager for progress bars
+    MSG_BACKGROUND_SUPERVISOR_CANCEL = 7503,   // *sent* to Supervisor to cancel process
+
+    MSG_WORKER_THREAD_UNIT_TICK = 7504,
+    MSG_WORKER_THREAD_DONE = 7505,
+    MSG_WORKER_THREAD_FAIL = 7506,   // sent by workers when they fail
+  };
+
+  BackgroundSupervisor()
     : m_bDone(false), wxEvtHandler()
   {}
 
-  virtual ~BackgroundTask()
+  virtual ~BackgroundSupervisor()
   {}
 
   virtual void cancel() = 0;
   virtual bool start() = 0;
   virtual bool testDone() = 0;
+  virtual void OnWorkerFail(wxCommandEvent& event) = 0;
+  virtual void OnWorkerUnitTick(wxCommandEvent& event) = 0;
+  virtual void OnWorkerDone(wxCommandEvent& event) = 0;
 
   bool isDone() const {return m_bDone;}
   void setDone() { m_bDone = true; }
@@ -74,20 +95,22 @@ public:
 class Reconstructor;
 class ImageFile;
 class ProjectionFileDocument;
-class ReconstructionThread;
+class ReconstructorWorker;
 class ProjectionFileView;
 
 
-class ThreadedReconstructor : public BackgroundTask {
+class ReconstructorSupervisor : public BackgroundSupervisor {
 private:
-  DECLARE_DYNAMIC_CLASS(ThreadedReconstructor)
+  DECLARE_DYNAMIC_CLASS(ReconstructorSupervisor)
+  wxCriticalSection m_critsectThreadContainer;
 
   std::vector<ImageFile*> m_vecpChildImageFile;
-  std::vector<ReconstructionThread*> m_vecpThread;
+  typedef std::vector<ReconstructorWorker*> ThreadContainer;
+  ThreadContainer m_vecpThread;
   ProjectionFileView* m_pProjView;
   wxProgressDialog* m_pDialogProgress;
   wxGauge* m_pGauge;
-  
+    
   volatile bool m_bFail;
   int m_iNumThreads;
   const int m_iImageNX;
@@ -95,23 +118,23 @@ private:
   volatile int m_iRunning;
   volatile unsigned int m_iViewsDone;
   volatile unsigned int m_iTotalViews;
-  //wxCriticalSection m_criticalSection;
   wxString m_strLabel;
   Timer* m_pTimer;
   bool m_bCancelled;
   bool m_bCancelling;
 
 public:
-   ThreadedReconstructor (ProjectionFileView* pProjView, 
+   ReconstructorSupervisor (ProjectionFileView* pProjView, 
    int iNX, int iNY, const char* pszFilterName, double dFilterParam, const char* pszFilterMethod, 
    int iZeropad, const char* pszFilterGenerationName, const char* pszInterpName, int iInterpParam,
    const char* pszBackprojectName, const char* const pszLabel);
 
-   ThreadedReconstructor ()
-     : m_bFail(true), m_iNumThreads(0), m_iImageNX(0), m_iImageNY(0), m_iTotalViews(0), BackgroundTask()
+   ReconstructorSupervisor ()
+     : m_bFail(true), m_iNumThreads(0), m_iImageNX(0), m_iImageNY(0), m_iTotalViews(0), 
+     BackgroundSupervisor()
    {}
 
-   ~ThreadedReconstructor ();
+   ~ReconstructorSupervisor ();
 
   void OnThreadEvent (wxCommandEvent& event);
   void cancel();
@@ -121,6 +144,9 @@ public:
   bool fail() const {return m_bFail;}
   bool testDone();
   void cleanUp();
+  virtual void OnWorkerFail(wxCommandEvent& event);
+  virtual void OnWorkerUnitTick(wxCommandEvent& event);
+  virtual void OnWorkerDone(wxCommandEvent& event);
 
   ImageFile* getImageFile();
 
@@ -129,20 +155,29 @@ public:
 
 
 
-class ReconstructionThread : public wxThread {
+class ReconstructorWorker : public wxThread {
 private:
-  ThreadedReconstructor* m_pSupervisor;
-  Reconstructor* m_pReconstructor;
+  ReconstructorSupervisor* m_pSupervisor;
   int m_iStartView;
   int m_iNumViews;
   int m_iThread;
+  ProjectionFileView* m_pProjView;
+  ImageFile* m_pImageFile;
+  const std::string m_strFilterName;
+  const double m_dFilterParam;
+  const std::string m_strFilterMethod;
+  const int m_iZeropad;
+  const std::string m_strFilterGenerationName;
+  const std::string m_strInterpName;
+  const int m_iInterpParam;
+  const std::string m_strBackprojectName;
 
 public:
-  ReconstructionThread (ThreadedReconstructor* pSupervisor, 
+  ReconstructorWorker (ReconstructorSupervisor* pSupervisor, 
     ProjectionFileView* pProjFile, ImageFile* pImageFile, 
     int iThread, int iStartView, int iNumViews,
-   const char* pszFilterName, double dFilterParam, const char* pszFilterMethod, 
-   int iZeropad, const char* pszFilterGenerationName, const char* pszInterpName, int iInterpParam,
+   const char* const pszFilterName, double dFilterParam, const char* const pszFilterMethod, 
+   int iZeropad, const char* const pszFilterGenerationName, const char* const pszInterpName, int iInterpParam,
    const char* pszBackprojectName);
 
   virtual wxThread::ExitCode Entry();      // thread execution starts here
@@ -153,4 +188,4 @@ public:
 
 
 #endif
-  
\ No newline at end of file
+  
index d8c09843ea940903d58d72b36b20d10113089477..888b9b46716570ab00697d918d04781ce24cdfa1 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: views.cpp,v 1.114 2001/02/23 02:06:02 kevin Exp $
+**  $Id: views.cpp,v 1.115 2001/02/23 18:56:56 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
@@ -2434,7 +2434,7 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event)
         
       } else {
         if (theApp->getUseBackgroundTasks() || theApp->getNumberCPU() > 1) {
-          ThreadedReconstructor* pReconstructor = new ThreadedReconstructor (this, 
+          ReconstructorSupervisor* pReconstructor = new ReconstructorSupervisor (this, 
             m_iDefaultNX, m_iDefaultNY, optFilterName.c_str(), 
             m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), 
             optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), os.str().c_str());