X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fbackgroundsupr.cpp;h=4f9e4c616eaab24cb1cf256b8e448048231ed1ab;hb=4d5f56994972346351a48730315a7d85924103ba;hp=2b8c0491cd2f034111f014d8a77d95701c750aa5;hpb=fada6fda06c0b0127552ff8bcb169a737d1e828f;p=ctsim.git diff --git a/src/backgroundsupr.cpp b/src/backgroundsupr.cpp index 2b8c049..4f9e4c6 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.2 2001/02/25 07:36:26 kevin Exp $ +** $Id: backgroundsupr.cpp,v 1.6 2001/02/25 16:21:36 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++) @@ -101,22 +101,25 @@ BackgroundSupervisor::~BackgroundSupervisor() } void -BackgroundSupervisor::deleteAnyWorkers() +BackgroundSupervisor::deleteWorkers() { - m_critsectThreadContainer.Enter(); + 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 } - m_critsectThreadContainer.Leave(); while (m_iRunning > 0) { Sleep(50); ProcessPendingEvents(); } + m_iRunning = 0; + m_bWorkersDeleted = true; } - bool BackgroundSupervisor::start() { @@ -174,8 +177,8 @@ void BackgroundSupervisor::OnCancel(wxCommandEvent& event) { m_bCancelled = true; - deleteAnyWorkers(); m_bDone = true; + deleteWorkers(); } void @@ -212,9 +215,6 @@ BackgroundSupervisor::OnWorkerDone (wxCommandEvent& event) { m_iRunning--; wxASSERT (m_iRunning >= 0); - m_critsectThreadContainer.Enter(); - m_vecpThreads[event.GetInt()] = NULL; - m_critsectThreadContainer.Leave(); #ifdef DEBUG if (theApp->getVerboseLogging()) { @@ -225,21 +225,21 @@ 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 BackgroundSupervisor::OnWorkerFail (wxCommandEvent& event) { m_iRunning--; - m_critsectThreadContainer.Enter(); - m_vecpThreads[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(); + wxCommandEvent dummy; + OnCancel(dummy); }