X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fdocs.cpp;h=6ea75a0509aed50a7664d80c68c84d6e7ecf6629;hb=acbdc3e0bc421e5df6fdcea262a66a189d65dad3;hp=460082a63ae8f3a14f1e30a1beccb1c322e21352;hpb=0730f9f3adbf326b9d4bac754634399ad688efd1;p=ctsim.git diff --git a/src/docs.cpp b/src/docs.cpp index 460082a..6ea75a0 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.25 2001/02/22 11:05:38 kevin Exp $ +** $Id: docs.cpp,v 1.32 2001/03/05 15:10:58 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,9 +126,74 @@ ImageFileDocument::Revert () return true; } +// BackgroundProcessingDocument - Base Class + +IMPLEMENT_DYNAMIC_CLASS(BackgroundProcessingDocument, wxDocument) +BEGIN_EVENT_TABLE(BackgroundProcessingDocument, wxDocument) +#ifdef CTSIM_THREADS +EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_ADD, BackgroundProcessingDocument::OnAddBackground) +EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_REMOVE, BackgroundProcessingDocument::OnRemoveBackground) +#endif +END_EVENT_TABLE() + +#ifdef CTSIM_TREADS +void +BackgroundProcessingDocument::OnAddBackground (wxCommandEvent& event) +{ + BackgroundSupervisor* pSupervisor = reinterpret_cast(event.GetClientData()); + wxASSERT (pSupervisor != NULL); + + wxCriticalSectionLocker locker (m_criticalSection); + if (pSupervisor) + m_vecpBackgroundSupervisors.push_back (pSupervisor); +} + +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++) + 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]"); + + pSupervisor->onAckDocumentRemove(); +} +#endif + +void +BackgroundProcessingDocument::cancelRunningTasks() +{ +#ifdef CTSIM_THREADS + m_criticalSection.Enter(); + for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); + i != m_vecpBackgroundSupervisors.end(); i++) + (*i)->onCancel(); + m_criticalSection.Leave(); + + while (m_vecpBackgroundSupervisors.size() > 0) { + ::wxYield(); + ::wxUsleep(50); + } +#endif +} + + // ProjectionFileDocument -IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, wxDocument) +IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, BackgroundProcessingTask) bool ProjectionFileDocument::OnSaveDocument(const wxString& filename) @@ -145,31 +210,9 @@ ProjectionFileDocument::OnSaveDocument(const wxString& filename) ProjectionFileDocument::~ProjectionFileDocument() { - for (int i = 0; i < m_vecpActiveReconstructors.size(); i++) { - ThreadedReconstructor* pThreadedReconstructor = m_vecpActiveReconstructors[i]; - if (pThreadedReconstructor) { - pThreadedReconstructor->cancel(); - } - } + cancelRunningTasks(); - delete m_pProjectionFile; -} - -void -ProjectionFileDocument::addReconstructor (ThreadedReconstructor* pRecon) -{ - wxCriticalSectionLocker locker (m_criticalSection); - m_vecpActiveReconstructors.push_back (pRecon); -} - -void -ProjectionFileDocument::removeReconstructor (ThreadedReconstructor* pRecon) -{ - wxCriticalSectionLocker locker (m_criticalSection); - for (int i = 0; i < m_vecpActiveReconstructors.size(); i++) { - if (m_vecpActiveReconstructors[i] == pRecon) - m_vecpActiveReconstructors[i] = NULL; - } + delete m_pProjectionFile; } bool @@ -215,7 +258,12 @@ ProjectionFileDocument::getView() const // PhantomFileDocument -IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, wxDocument) +IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, BackgroundProcessingTask) + +PhantomFileDocument::~PhantomFileDocument() +{ + cancelRunningTasks(); +} bool PhantomFileDocument::OnOpenDocument(const wxString& filename)