r586: *** empty log message ***
[ctsim.git] / src / backgroundsupr.cpp
index 04af1d6cb858a41681bfa77f1ecd53c184636fd9..4083c8220f8647253b19f44aa124c2bd8eae9bb3 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2001 Kevin Rosenberg
 **
-**  $Id: backgroundsupr.cpp,v 1.3 2001/02/25 08:00:57 kevin Exp $
+**  $Id: backgroundsupr.cpp,v 1.7 2001/02/25 19:24:01 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,11 +70,11 @@ BackgroundSupervisor::cancelSupervisor (BackgroundSupervisor* pSupervisor)
 BackgroundSupervisor::BackgroundSupervisor (wxFrame* pParentFrame, wxDocument* pDocument, const char* const pszProcessTitle, int iTotalUnits)
     : m_pParentFrame(pParentFrame), m_pDocument(pDocument), m_pDialogProgress(NULL), m_strProcessTitle(pszProcessTitle), 
     m_iTotalUnits(iTotalUnits), m_iNumThreads(0), m_bDone(false), m_bFail(false), m_bCancelled(false), 
-    m_pTimer(NULL), m_bBackgroundTaskAdded(false),
+    m_pTimer(NULL), m_bBackgroundTaskAdded(false), m_bWorkersDeleted(false),
     wxEvtHandler()
 {
   m_iNumThreads = theApp->getNumberCPU();
-  //  ++m_iNumThreads;
+//    ++m_iNumThreads;
 
   m_vecpThreads.reserve (m_iNumThreads);
   for (int iThread = 0; iThread < m_iNumThreads; iThread++)
@@ -84,16 +84,6 @@ BackgroundSupervisor::BackgroundSupervisor (wxFrame* pParentFrame, wxDocument* p
 
 BackgroundSupervisor::~BackgroundSupervisor()
 {
-  for (int i = 0; i < m_iNumThreads; i++) 
-    if (m_vecpThreads[i]) {
-      m_vecpThreads[i]->Delete(); // sends Destroy message to workers
-  }
-
-  while (m_iRunning > 0) {
-    Sleep(50);
-    ProcessPendingEvents();
-  }
-
   if (m_bBackgroundTaskAdded) {
     wxCommandEvent doneEvent (wxEVT_COMMAND_MENU_SELECTED, MSG_BACKGROUND_SUPERVISOR_REMOVE);
     doneEvent.SetClientData (this);
@@ -102,7 +92,7 @@ BackgroundSupervisor::~BackgroundSupervisor()
   }
 
   while (m_bBackgroundTaskAdded) {
-    Sleep(50);
+    m_pMyThread->Sleep(50);
     ProcessPendingEvents();
   }
 
@@ -110,6 +100,26 @@ BackgroundSupervisor::~BackgroundSupervisor()
   delete m_pDialogProgress;
 }
 
+void
+BackgroundSupervisor::deleteWorkers()
+{
+  wxCriticalSectionLocker lock (m_critsectThreads);
+  if (m_bWorkersDeleted)
+    return;
+
+  for (int i = 0; i < m_iNumThreads; i++) 
+    if (m_vecpThreads[i]) {
+      m_vecpThreads[i]->Delete(); // sends Destroy message to workers
+  }
+
+  while (m_iRunning > 0) {
+    m_pMyThread->Sleep(50);
+    ProcessPendingEvents();
+  }
+  m_iRunning = 0;
+  m_bWorkersDeleted = true;
+}
+
 bool
 BackgroundSupervisor::start()
 {
@@ -168,6 +178,7 @@ BackgroundSupervisor::OnCancel(wxCommandEvent& event)
 {
   m_bCancelled = true;
   m_bDone = true;
+  deleteWorkers();
 }
 
 void
@@ -214,8 +225,10 @@ BackgroundSupervisor::OnWorkerDone (wxCommandEvent& event)
     wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event
   }
 #endif
-  if (m_iRunning <= 0 && ! m_bCancelled)
+  if (m_iRunning <= 0 && ! m_bCancelled) {
+    deleteWorkers();
     onDone();
+  }
 }
 
 void