X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fbackgroundsupr.cpp;h=8107a9e0b1b280d67091c2eb391f5be2c690eb74;hb=9ff5b5165b2c8871bd4b29ccd5ca794638414615;hp=9eb806fda46d69f13f538ad5159222cdfed51f68;hpb=cd93aebb4dec4e0ae88d53f131c2320ae92d0cab;p=ctsim.git diff --git a/src/backgroundsupr.cpp b/src/backgroundsupr.cpp index 9eb806f..8107a9e 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.12 2001/03/04 22:30:19 kevin Exp $ +** $Id: backgroundsupr.cpp,v 1.19 2001/03/11 06:34:37 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 @@ -40,6 +40,8 @@ #ifdef HAVE_WXTHREADS +#define USE_BKGMGR 1 + //////////////////////////////////////////////////////////////////////////// // // Class BackgroundSupervisor -- An event handler run by a SupervisorThread @@ -52,15 +54,15 @@ END_EVENT_TABLE() -BackgroundSupervisor::BackgroundSupervisor (SupervisorThread* pMyThread, wxFrame* pParentFrame, wxDocument* pDocument, const char* const pszProcessTitle, int iTotalUnits) +BackgroundSupervisor::BackgroundSupervisor (SupervisorThread* pMyThread, wxFrame* pParentFrame, BackgroundProcessingDocument* pDocument, const char* const pszProcessTitle, int iTotalUnits) : wxEvtHandler(), m_pMyThread(pMyThread), m_pParentFrame(pParentFrame), m_pDocument(pDocument), m_strProcessTitle(pszProcessTitle), m_iTotalUnits(iTotalUnits), m_iNumThreads(0), m_bDone(false), m_bFail(false), m_bCancelled(false), m_iRunning(0), - m_pTimer(NULL), m_bBackgroundTaskAdded(false), m_bWorkersDeleted(false) + m_pTimer(NULL), m_bWorkersDeleted(false), m_bBackgroundManagerAdded(false) { m_iNumThreads = theApp->getNumberCPU(); // ++m_iNumThreads; - m_vecpThreads.reserve (m_iNumThreads); + m_vecpThreads.resize (m_iNumThreads); for (int iThread = 0; iThread < m_iNumThreads; iThread++) m_vecpThreads[iThread] = NULL; @@ -68,16 +70,7 @@ BackgroundSupervisor::BackgroundSupervisor (SupervisorThread* pMyThread, wxFrame BackgroundSupervisor::~BackgroundSupervisor() { - if (m_bBackgroundTaskAdded) { - wxCommandEvent doneEvent (wxEVT_COMMAND_MENU_SELECTED, MSG_BACKGROUND_SUPERVISOR_REMOVE); - doneEvent.SetClientData (this); - wxPostEvent (theApp->getBackgroundManager(), doneEvent); - wxPostEvent (m_pDocument, doneEvent); - } - - while (m_bBackgroundTaskAdded) { - m_pMyThread->Sleep(50); - } + m_pDocument->removeBackgroundSupervisor (this); delete m_pTimer; } @@ -90,17 +83,27 @@ BackgroundSupervisor::deleteWorkers() return; for (int i = 0; i < m_iNumThreads; i++) - if (m_vecpThreads[i]) { - m_vecpThreads[i]->Delete(); // sends Destroy message to workers - } + if (m_vecpThreads[i]) + m_vecpThreads[i]->Delete(); // send Destroy message to workers + +#ifdef USE_BKGMGR + wxCommandEvent doneEvent (wxEVT_COMMAND_MENU_SELECTED, MSG_BACKGROUND_SUPERVISOR_REMOVE); + doneEvent.SetClientData (this); + wxPostEvent (theApp->getBackgroundManager(), doneEvent); +#endif - while (m_iRunning > 0) { + while (m_iRunning > 0 || m_bBackgroundManagerAdded) m_pMyThread->Sleep(50); - } - m_iRunning = 0; + m_bWorkersDeleted = true; } +void +BackgroundSupervisor::ackRemoveBackgroundManager() +{ + m_bBackgroundManagerAdded = false; +} + bool BackgroundSupervisor::start() { @@ -133,14 +136,18 @@ BackgroundSupervisor::start() std::string strLabel (m_strProcessTitle); strLabel += " "; strLabel += m_pParentFrame->GetTitle(); + +#ifdef USE_BKGMGR wxCommandEvent addTaskEvent (wxEVT_COMMAND_MENU_SELECTED, MSG_BACKGROUND_SUPERVISOR_ADD); addTaskEvent.SetString (strLabel.c_str()); addTaskEvent.SetInt (m_iTotalUnits); addTaskEvent.SetClientData (this); wxPostEvent (theApp->getBackgroundManager(), addTaskEvent); - wxPostEvent (m_pDocument, addTaskEvent); - m_bBackgroundTaskAdded = true; - +#endif + + m_pDocument->addBackgroundSupervisor (this); + m_bBackgroundManagerAdded = true; + m_iRunning = m_iNumThreads; m_iUnitsDone = 0; @@ -157,27 +164,18 @@ BackgroundSupervisor::onCancel() m_bDone = true; } -void -BackgroundSupervisor::onAckDocumentRemove() -{ - m_bBackgroundTaskAdded = false; -} - void BackgroundSupervisor::onWorkerUnitTick () { ++m_iUnitsDone; -#ifdef DEBUG - if (theApp->getVerboseLogging()) - *theApp->getLog() << "Units done: " << static_cast(m_iUnitsDone) <<"\n"; -#endif - +#ifdef USE_BKGMGR wxCommandEvent addTaskEvent (wxEVT_COMMAND_MENU_SELECTED, MSG_BACKGROUND_SUPERVISOR_UNIT_TICK); addTaskEvent.SetInt (m_iUnitsDone - 1); addTaskEvent.SetClientData (this); wxPostEvent (theApp->getBackgroundManager(), addTaskEvent); +#endif } void @@ -187,7 +185,6 @@ BackgroundSupervisor::onWorkerDone (int iThread) critsectDone.Enter(); m_iRunning--; - wxASSERT (m_iRunning >= 0); #ifdef DEBUG if (theApp->getVerboseLogging()) {