X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fbackgroundsupr.cpp;h=129b38fa642482f11ed518daf37e06ef45f7caf2;hb=8cce345df80fdbeea1c03a04a71d805951a87b74;hp=c0326d68522968d0bcc21453823053a7c8b6c57b;hpb=3b09207d7c37bc3d48e331657353123ed2f66ed9;p=ctsim.git diff --git a/src/backgroundsupr.cpp b/src/backgroundsupr.cpp index c0326d6..129b38f 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.1 2001/02/25 06:32:12 kevin Exp $ +** $Id: backgroundsupr.cpp,v 1.11 2001/03/04 03:14:47 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 @@ -38,10 +38,7 @@ #include "backgroundsupr.h" #include "backgroundmgr.h" -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif - +#ifdef HAVE_WXTHREADS //////////////////////////////////////////////////////////////////////////// // @@ -67,14 +64,14 @@ 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), +BackgroundSupervisor::BackgroundSupervisor (SupervisorThread* pMyThread, wxFrame* pParentFrame, wxDocument* pDocument, const char* const pszProcessTitle, int iTotalUnits) + : 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_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++) @@ -92,38 +89,40 @@ BackgroundSupervisor::~BackgroundSupervisor() } while (m_bBackgroundTaskAdded) { - Sleep(50); - ::wxYield(); + m_pMyThread->Sleep(50); + ProcessPendingEvents(); } delete m_pTimer; - delete m_pDialogProgress; } 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); - ::wxYield(); + m_pMyThread->Sleep(50); + ProcessPendingEvents(); } + m_iRunning = 0; + m_bWorkersDeleted = true; } - bool BackgroundSupervisor::start() { int iBaseUnits = m_iTotalUnits / m_iNumThreads; int iExtraUnits = m_iTotalUnits % m_iNumThreads; + int iStartUnit = 0; for (int iThread = 0; iThread < m_iNumThreads; iThread++) { - int iStartUnit = iThread * iBaseUnits; int iNumUnits = iBaseUnits; if (iThread < iExtraUnits) ++iNumUnits; @@ -138,28 +137,24 @@ BackgroundSupervisor::start() m_strFailMessage = "Thread creation failed [BackgroundSupervisor]"; break; } - m_vecpThreads[iThread]->SetPriority (40); + m_vecpThreads[iThread]->SetPriority (40); + iStartUnit += iNumUnits; } if (m_bFail) return false; m_pTimer = new Timer; - if (! theApp->getUseBackgroundTasks()) - m_pDialogProgress = new wxProgressDialog (_T("Filtered Backprojection"), _T("Reconstruction Progress"), - m_iTotalUnits, m_pParentFrame, wxPD_CAN_ABORT | wxPD_AUTO_HIDE); - else { - std::string strLabel (m_strProcessTitle); - strLabel += " "; - strLabel += m_pParentFrame->GetTitle(); - 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; - } + std::string strLabel (m_strProcessTitle); + strLabel += " "; + strLabel += m_pParentFrame->GetTitle(); + 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; m_iRunning = m_iNumThreads; m_iUnitsDone = 0; @@ -174,8 +169,8 @@ void BackgroundSupervisor::OnCancel(wxCommandEvent& event) { m_bCancelled = true; - deleteAnyWorkers(); m_bDone = true; + deleteWorkers(); } void @@ -194,17 +189,10 @@ BackgroundSupervisor::OnWorkerUnitTick (wxCommandEvent& event) *theApp->getLog() << "Units done: " << static_cast(m_iUnitsDone) <<"\n"; #endif - if (m_pDialogProgress) { - if (! m_pDialogProgress->Update (m_iUnitsDone - 1)) { - wxCommandEvent dummy; - OnCancel (dummy); - } - } else { - wxCommandEvent addTaskEvent (wxEVT_COMMAND_MENU_SELECTED, MSG_BACKGROUND_SUPERVISOR_UNIT_TICK); - addTaskEvent.SetInt (m_iUnitsDone - 1); - addTaskEvent.SetClientData (this); - wxPostEvent (theApp->getBackgroundManager(), addTaskEvent); - } + wxCommandEvent addTaskEvent (wxEVT_COMMAND_MENU_SELECTED, MSG_BACKGROUND_SUPERVISOR_UNIT_TICK); + addTaskEvent.SetInt (m_iUnitsDone - 1); + addTaskEvent.SetClientData (this); + wxPostEvent (theApp->getBackgroundManager(), addTaskEvent); } void @@ -212,9 +200,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 +210,22 @@ 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); } +#endif // HAVE_WXTHREADS