X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fdocs.cpp;h=96f7ee3c2ae793d842e34f91a0fce7abdb99b47f;hb=4d5f56994972346351a48730315a7d85924103ba;hp=b356033164193c8a900a84b1d0ed1678895d974e;hpb=1ef49f39828474ed05fe69aff68d400e3b7d4044;p=ctsim.git diff --git a/src/docs.cpp b/src/docs.cpp index b356033..96f7ee3 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: docs.cpp,v 1.26 2001/02/23 18:56:56 kevin Exp $ +** $Id: docs.cpp,v 1.30 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 @@ -126,70 +126,88 @@ ImageFileDocument::Revert () return true; } -// ProjectionFileDocument +// BackgroundProcessingDocument - Base Class -IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, wxDocument) -BEGIN_EVENT_TABLE(ProjectionFileDocument, wxDocument) -EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_ADD, ProjectionFileDocument::OnAddBackground) -EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_REMOVE, ProjectionFileDocument::OnRemoveBackground) +IMPLEMENT_DYNAMIC_CLASS(BackgroundProcessingDocument, wxDocument) +BEGIN_EVENT_TABLE(BackgroundProcessingDocument, wxDocument) +EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_ADD, BackgroundProcessingDocument::OnAddBackground) +EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_REMOVE, BackgroundProcessingDocument::OnRemoveBackground) END_EVENT_TABLE() -bool -ProjectionFileDocument::OnSaveDocument(const wxString& filename) +void +BackgroundProcessingDocument::OnAddBackground (wxCommandEvent& event) { - if (! m_pProjectionFile->write (filename.c_str())) { - *theApp->getLog() << "Unable to write projection file " << filename << "\n"; - return false; - } - if (theApp->getVerboseLogging()) - *theApp->getLog() << "Wrote projection file " << filename << "\n"; - Modify(false); - return true; + BackgroundSupervisor* pSupervisor = reinterpret_cast(event.GetClientData()); + wxASSERT (pSupervisor != NULL); + + wxCriticalSectionLocker locker (m_criticalSection); + if (pSupervisor) + m_vecpBackgroundSupervisors.push_back (pSupervisor); } -ProjectionFileDocument::~ProjectionFileDocument() +void +BackgroundProcessingDocument::OnRemoveBackground (wxCommandEvent& event) { + BackgroundSupervisor* pSupervisor = reinterpret_cast(event.GetClientData()); + wxASSERT (pSupervisor != NULL); + + m_criticalSection.Enter(); + bool bFound = false; for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); - i != m_vecpBackgroundSupervisors.end(); i++) { - (*i)->cancel(); - } + i != m_vecpBackgroundSupervisors.end(); + i++) + if (*i == pSupervisor) { + m_vecpBackgroundSupervisors.erase(i); + bFound = true; + break; + } + m_criticalSection.Leave(); + + if (! bFound) + sys_error (ERR_SEVERE, "Could not find background task [OnRemoveBackground]"); - m_vecpBackgroundSupervisors.clear(); - delete m_pProjectionFile; + wxCommandEvent ackEvent (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_DOCUMENT_ACK_REMOVE); + wxPostEvent (pSupervisor, ackEvent); } void -ProjectionFileDocument::OnAddBackground (wxCommandEvent& event) +BackgroundProcessingDocument::cancelRunningTasks() { -} + m_criticalSection.Enter(); + for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); + i != m_vecpBackgroundSupervisors.end(); i++) + BackgroundSupervisor::cancelSupervisor(*i); + m_criticalSection.Leave(); -void -ProjectionFileDocument::OnRemoveBackground (wxCommandEvent& event) -{ + while (m_vecpBackgroundSupervisors.size() > 0) { + ::wxYield(); + ::wxUsleep(50); + } } -void -ProjectionFileDocument::addReconstructor (BackgroundSupervisor* pRecon) + +// ProjectionFileDocument + +IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, BackgroundProcessingTask) + +bool +ProjectionFileDocument::OnSaveDocument(const wxString& filename) { - wxCriticalSectionLocker locker (m_criticalSection); - m_vecpBackgroundSupervisors.push_back (pRecon); + if (! m_pProjectionFile->write (filename.c_str())) { + *theApp->getLog() << "Unable to write projection file " << filename << "\n"; + return false; + } + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Wrote projection file " << filename << "\n"; + Modify(false); + return true; } -void -ProjectionFileDocument::removeReconstructor (BackgroundSupervisor* pRecon) +ProjectionFileDocument::~ProjectionFileDocument() { - wxCriticalSectionLocker locker (m_criticalSection); - bool bFound = false; - for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); - i != m_vecpBackgroundSupervisors.end(); - i++) - if (*i == pRecon) { - m_vecpBackgroundSupervisors.erase(i); - bFound = true; - break; - } - if (! bFound) - sys_error (ERR_SEVERE, "Could not find background task [ProjectionFileDocument::removeBackgroundTask"); + cancelRunningTasks(); + + delete m_pProjectionFile; } bool @@ -235,7 +253,12 @@ ProjectionFileDocument::getView() const // PhantomFileDocument -IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, wxDocument) +IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, BackgroundProcessingTask) + +PhantomFileDocument::~PhantomFileDocument() +{ + cancelRunningTasks(); +} bool PhantomFileDocument::OnOpenDocument(const wxString& filename)