r588: no message
[ctsim.git] / src / backgroundsupr.h
1 /*****************************************************************************
2 ** FILE IDENTIFICATION
3 **
4 **   Name:          backgroundsupr.h
5 **   Purpose:       Header file for background supervisors
6 **   Programmer:    Kevin Rosenberg
7 **   Date Started:  February 2001
8 **
9 **  This is part of the CTSim program
10 **  Copyright (C) 1983-2001 Kevin Rosenberg
11 **
12 **  $Id: backgroundsupr.h,v 1.5 2001/02/26 17:36:56 kevin Exp $
13 **
14 **  This program is free software; you can redistribute it and/or modify
15 **  it under the terms of the GNU General Public License (version 2) as
16 **  published by the Free Software Foundation.
17 **
18 **  This program is distributed in the hope that it will be useful,
19 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 **  GNU General Public License for more details.
22 **
23 **  You should have received a copy of the GNU General Public License
24 **  along with this program; if not, write to the Free Software
25 **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 ******************************************************************************/
27
28 #ifndef _BACKGROUNDSUPR_H
29 #define _BACKGROUNDSUPR_H
30
31 #include <vector>
32 #include <wx/thread.h>
33 #include <wx/progdlg.h>
34 #include "timer.h"
35
36 // This thread creates a SupervisorTask event handler object
37 // The thread is detached and terminates when SupervisorTask terminates
38 class SupervisorThread : public wxThread {
39 private:
40
41 public:
42   SupervisorThread()
43     : wxThread(wxTHREAD_DETACHED)
44   {}
45
46 };
47
48
49 // Pure virtual class for BackgroundSupervisor that can communication
50 // with BackgroundManager via messages
51 class BackgroundWorkerThread;
52
53 class BackgroundSupervisor : public wxEvtHandler {
54 private:
55   DECLARE_DYNAMIC_CLASS(BackgroundSupervisor)
56       
57   SupervisorThread* m_pMyThread;
58   wxFrame* m_pParentFrame;
59   wxDocument* m_pDocument;
60   const std::string m_strProcessTitle;
61   wxProgressDialog* m_pDialogProgress;
62
63   volatile bool m_bFail;
64   std::string m_strFailMessage;
65   int m_iNumThreads;
66   volatile int m_iRunning;
67   unsigned int m_iUnitsDone;
68   const unsigned int m_iTotalUnits;
69   bool m_bCancelled;
70   bool m_bDone;
71   Timer* m_pTimer;
72   bool m_bBackgroundTaskAdded;
73   bool m_bWorkersDeleted;
74
75   typedef std::vector<BackgroundWorkerThread*> ThreadContainer;
76   ThreadContainer m_vecpThreads;
77   wxCriticalSection m_critsectThreads;
78
79
80 public:
81   enum {
82     MSG_BACKGROUND_SUPERVISOR_ADD = 7500, // sends to BackgroundManager and Document
83     MSG_BACKGROUND_SUPERVISOR_REMOVE = 7501, // sends to BackgroundManager and Document
84     MSG_BACKGROUND_SUPERVISOR_UNIT_TICK = 7502,  // sends to BackgroundManager for progress bars
85     MSG_BACKGROUND_SUPERVISOR_CANCEL = 7503,   // *sent* to Supervisor to cancel process
86     MSG_DOCUMENT_ACK_REMOVE = 7504,
87
88     MSG_WORKER_THREAD_UNIT_TICK = 7505,
89     MSG_WORKER_THREAD_DONE = 7506,
90     MSG_WORKER_THREAD_FAIL = 7507,   // sent by workers when they fail
91   };
92
93   BackgroundSupervisor (SupervisorThread* pMyThread, wxFrame* pParentFrame, wxDocument* pDocument, const char* const pszProcessTitle, 
94     int iTotalUnits);
95
96   BackgroundSupervisor ()
97     : m_iTotalUnits(0), wxEvtHandler()
98   {}
99
100   virtual ~BackgroundSupervisor();
101
102   virtual BackgroundWorkerThread* createWorker (int iThread, int iStartUnit, int iNumUnits)
103   { return NULL; }
104
105   bool start();
106   virtual void onDone() {};
107   
108   virtual void OnWorkerFail(wxCommandEvent& event);
109   virtual void OnWorkerUnitTick(wxCommandEvent& event);
110   virtual void OnWorkerDone(wxCommandEvent& event);
111   virtual void OnCancel(wxCommandEvent& event);
112   virtual void OnAckDocumentRemove(wxCommandEvent& event);
113
114   void deleteWorkers();
115   bool workersDeleted() const { return m_bWorkersDeleted; }
116   bool isDone() const {return m_bDone;}
117   void setDone() { m_bDone = true; }
118   bool fail() const {return m_bFail;}
119   const std::string& getFailMessage() const { return m_strFailMessage; }
120
121   int getNumWorkers() const { return m_iNumThreads; }
122   double getTimerEnd() { return m_pTimer->timerEnd(); }
123
124   static void cancelSupervisor (BackgroundSupervisor* pSupervisor);
125
126   DECLARE_EVENT_TABLE()
127 };
128
129
130 class BackgroundWorkerThread : public wxThread {
131 protected:
132   BackgroundSupervisor* m_pSupervisor;
133   const int m_iStartUnit;
134   const int m_iNumUnits;
135   const int m_iThread;
136
137 public:
138   BackgroundWorkerThread (BackgroundSupervisor* pSupervisor, int iThread, int iStartUnit, int iNumUnits)
139     : m_pSupervisor(pSupervisor), m_iThread(iThread), m_iStartUnit(iStartUnit), m_iNumUnits(iNumUnits),
140     wxThread (wxTHREAD_DETACHED)
141   {}
142 };
143
144 #endif  // _BACKGROUNDSUPR_H_