00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "stdafx.h"
00037 #include "ManagedThread.h"
00038
00039 #include "ErrorHandlerMacros.h"
00040 #include "GenericEvent.h"
00041 #include "OSManager.h"
00042
00043 #ifdef _MEMORY_DEBUG
00044 #define new DEBUG_NEW
00045 #define malloc DEBUG_MALLOC
00046 static char THIS_FILE[] = __FILE__;
00047 #endif
00048
00049 KOMODIA_NAMESPACE_START
00050
00051 #define CManagedThread_Class "CManagedThread"
00052
00053 CManagedThread::CManagedThread(LPManagedThreadProc pProc) : CErrorHandler(),
00054 m_pThread(NULL),
00055 m_pUserProc(pProc),
00056 m_pEnterEvent(NULL),
00057 m_pExitEvent(NULL),
00058 m_dwThreadTimeout(20000),
00059 m_bDestructor(FALSE)
00060 {
00061 try
00062 {
00063
00064 SetName(CManagedThread_Class);
00065
00066
00067 m_pThread=COSManager::CreateThread(ManagedThread);
00068 }
00069 ERROR_HANDLER("CManagedThread")
00070 }
00071
00072 CManagedThread::~CManagedThread()
00073 {
00074 try
00075 {
00076
00077 m_bDestructor=TRUE;
00078
00079
00080 Stop();
00081 }
00082 ERROR_HANDLER("~CManagedThread")
00083 }
00084
00085 DWORD CManagedThread::ManagedThread(LPVOID lpData)
00086 {
00087 try
00088 {
00089
00090 CManagedThread* pClass;
00091 pClass=(CManagedThread*)lpData;
00092
00093
00094 BOOL bExit;
00095 bExit=FALSE;
00096
00097
00098 if (pClass->m_pEnterEvent)
00099 pClass->m_pEnterEvent->Set();
00100 else
00101 return FALSE;
00102
00103
00104 DWORD dwValue;
00105
00106
00107 try
00108 {
00109 dwValue=(*pClass->m_pUserProc)(pClass->m_pExitEvent,
00110 pClass->m_lpData);
00111 }
00112 catch (...)
00113 {
00114 dwValue=FALSE;
00115 }
00116
00117 try
00118 {
00119
00120 pClass->m_pEnterEvent->Set();
00121 }
00122 catch (...)
00123 {
00124 }
00125
00126
00127 return dwValue;
00128 }
00129 ERROR_HANDLER_STATIC_RETURN(CManagedThread_Class,"ManagedThread",FALSE)
00130 }
00131
00132 BOOL CManagedThread::Start(LPVOID lpData)
00133 {
00134 try
00135 {
00136
00137 if (m_pEnterEvent ||
00138 m_pExitEvent)
00139 {
00140
00141 ReportError("Start","Already running!");
00142
00143
00144 return FALSE;
00145 }
00146
00147
00148 m_pEnterEvent=COSManager::CreateEvent();
00149 m_pExitEvent=COSManager::CreateEvent();
00150
00151
00152 m_lpData=lpData;
00153
00154
00155 m_pThread->Start((LPVOID)this);
00156
00157
00158 if (m_pEnterEvent->Wait(m_dwThreadTimeout))
00159 {
00160
00161 ReportError("Start","Timeout waiting for thread!");
00162
00163
00164 delete m_pThread;
00165 m_pThread=COSManager::CreateThread(ManagedThread);
00166
00167
00168 delete m_pEnterEvent;
00169 m_pEnterEvent=NULL;
00170
00171 delete m_pExitEvent;
00172 m_pExitEvent=NULL;
00173
00174
00175 return FALSE;
00176 }
00177 else
00178 return TRUE;
00179 }
00180 ERROR_HANDLER_RETURN("Start",FALSE)
00181 }
00182
00183 BOOL CManagedThread::Stop()
00184 {
00185 try
00186 {
00187 if (m_bDestructor)
00188 if (!m_pEnterEvent ||
00189 !m_pExitEvent)
00190 {
00191
00192 delete m_pThread;
00193
00194
00195 return TRUE;
00196 }
00197 else
00198 ;
00199 else
00200
00201 if (!m_pEnterEvent ||
00202 !m_pExitEvent)
00203 {
00204
00205 ReportError("Stop","Not running!");
00206
00207
00208 return FALSE;
00209 }
00210
00211
00212 DWORD dwThreadID;
00213 dwThreadID=m_pThread->GetThreadID();
00214
00215
00216 m_pExitEvent->Set();
00217
00218
00219 if (GetCurrentThreadId()!=dwThreadID &&
00220 m_pEnterEvent->Wait(m_dwThreadTimeout))
00221
00222 ReportError("Stop","Timeout waiting for thread!");
00223
00224
00225 delete m_pThread;
00226
00227
00228 m_pThread=NULL;
00229
00230
00231 if (!m_bDestructor)
00232 m_pThread=COSManager::CreateThread(ManagedThread);
00233
00234
00235 delete m_pEnterEvent;
00236 m_pEnterEvent=NULL;
00237
00238 delete m_pExitEvent;
00239 m_pExitEvent=NULL;
00240
00241
00242 return TRUE;
00243 }
00244 ERROR_HANDLER_RETURN("Stop",FALSE)
00245 }
00246
00247 void CManagedThread::SetThreadTimeout(DWORD dwTimeout)
00248 {
00249 try
00250 {
00251
00252 m_dwThreadTimeout=dwTimeout;
00253 }
00254 ERROR_HANDLER("SetThreadTimeout")
00255 }
00256
00257 CGenericThread* CManagedThread::GetThread()const
00258 {
00259 return m_pThread;
00260 }
00261
00262 void CManagedThread::SetPriority(CGenericThread::ThreadPriority aPriority)
00263 {
00264 try
00265 {
00266
00267 m_pThread->SetPriority(aPriority);
00268 }
00269 ERROR_HANDLER("SetPriority")
00270 }
00271
00272 KOMODIA_NAMESPACE_END