X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fbackgroundsupr.cpp;h=da2120db352c8b13c0bb3454f653527de7fdce74;hb=df521cfe14a9e0b47bdcd98d1f67d03acf242162;hp=04af1d6cb858a41681bfa77f1ecd53c184636fd9;hpb=c7435da167c4cec94d9f2da0410b5f544bb4c54d;p=ctsim.git diff --git a/src/backgroundsupr.cpp b/src/backgroundsupr.cpp index 04af1d6..da2120d 100644 --- a/src/backgroundsupr.cpp +++ b/src/backgroundsupr.cpp @@ -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.4 2001/02/25 08:43:03 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,7 +70,7 @@ 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(); @@ -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); @@ -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) { + 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