Thread.h
上传用户:yanganfa
上传日期:2007-01-01
资源大小:195k
文件大小:12k
源码类别:

进程与线程

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Abstract Base CThread class for creating general Worker Thread Objects
  3. /////////////////////////////////////////////////////////////////////////////
  4. /////////////////////////////////////////////////////////////////////////////
  5. //
  6. //@doc CTHREAD
  7. //
  8. //@module CThread.h |
  9. //
  10. //PROJECT : CThread Class
  11. //<nl>SUBSYSTEM : CThread Base Class
  12. //<nl>AUTHOR : Dominik Filipp, <cp>1999, Slovakia, Europe
  13. //
  14. //<nl>DESCRIPTION:
  15. //<nl>Abstract Base CThread Class header file.
  16. //
  17. // @topic CThreadException Class |
  18. // The base CException-derived class used in CThread-derived classes.
  19. // @topic CThread Class |
  20. // The base MFC CObject-derived class that encapsulates WINDOWS Worker Thread abilities.
  21. // <nl>CThread class offers many features that are not implemented or supported
  22. // by WINDOWS System. It allows to build up the full-fledged OOP Class hierarchy,
  23. // supports several levels of safe Thread Synchronization as well as the Thread Notification.
  24. // <nl><nl>Detailed information how do CThreads work, how should be managed or handled
  25. // can be found in the 'Developer.doc' documentation in 'Doc' subdirectory of the main
  26. // installation directory.
  27. // @topic License Conditions |
  28. // This software is a freeware and may be freely used or distributed without restriction.
  29. /////////////////////////////////////////////////////////////////////////////
  30. #if !defined(AFX_THREAD_H__23722BEF_CB24_11D2_BB7B_00104B654EDA__INCLUDED_)
  31. #define AFX_THREAD_H__23722BEF_CB24_11D2_BB7B_00104B654EDA__INCLUDED_
  32. #if _MSC_VER > 1000
  33. #pragma once
  34. #endif // _MSC_VER > 1000
  35. // Thread.h : header file
  36. //
  37. #include <winbase.h> // Synchronization functions
  38. #include <afxtempl.h> // MFC templates
  39. // Internal CThread Interface macros ////////////////////////////////////////
  40. #define SUPPORT_THREAD_SYNCHRONIZATION(ClassName) m_strThreadHandlerClassName = #ClassName; 
  41. m_bIsSynchronized = TRUE;
  42. #define SUPPORT_THREAD_NOTIFICATION m_bSupportSignalNotification = TRUE;
  43. /////////////////////////////////////////////////////////////////////////////
  44. class CThread;
  45. // @class CThreadException Class Members
  46. // @base public | CException
  47. class CThreadException : public CException
  48. {
  49. public:
  50. // @access <nl>Public Members:
  51. static enum {UNKNOWN_ERROR = 0,
  52.  CANNOT_CREATE_THREAD = 1,
  53.  THREAD_ALREADY_STARTED = 2,
  54.  CANNOT_TERMINATE_THREAD = 3,
  55.  CANNOT_CREATE_NOTIFICATION_OBJECT = 4,
  56.  CANNOT_SIGNAL_NOTIFICATION_OBJECT = 5};
  57. // @cmember CThreadException Constructor
  58. CThreadException(CThread* pThread = NULL);
  59. // @cmember CThreadException Constructor
  60. CThreadException(CThread* pThread, CString strErrorMsg, int nExceptionType = CThreadException::UNKNOWN_ERROR);
  61. // @cmember CThreadException Constructor
  62. CThreadException(CThread* pThread, UINT nErrorMsgID, int nExceptionType = CThreadException::UNKNOWN_ERROR);
  63. // @cmember Get CThread Object
  64. CThread* GetThread() const;
  65. // @cmember Get Error Message
  66. CString GetErrorMsg() const;
  67. // @cmember Get Type of Thrown Exception
  68. int GetExceptionType() const;
  69. // @cmember Report Error
  70. virtual int ReportError(UINT nType = MB_OK, UINT nMessageID = 0);
  71. // @cmember Get String Representation Corresponding to the System Error Code
  72. static CString GetLastSystemErrorMsg(DWORD dwSysErrorCode);
  73. // Attributes & Operations & Overridables
  74. protected:
  75. // @access <nl>Protected Members:
  76. CThread* m_pThread;
  77. CString m_strErrorMsg;
  78. int m_nExceptionType;
  79. // @cmember Set CThread Object Throwing an Exception
  80. void SetThread(CThread* pThread);
  81. // @cmember Set Error Message
  82. void SetErrorMsg(CString strErrorMsg);
  83. // @cmember Set Error Message
  84. void SetErrorMsg(UINT nErrorMsgID);
  85. // @cmember Set Error Message
  86. void SetExceptionType(int nType);
  87. };
  88. // @class CThread Class Members
  89. // @base public | CObject
  90. class CThread : public CObject
  91. {
  92. public:
  93. DECLARE_DYNAMIC(CThread)
  94. // Attributes
  95. public:
  96. // @access <nl>Public Members:
  97. static enum {DW_OK = 0x00000000,
  98.  DW_ERROR = 0xFFFFFFFF,
  99.  DW_UNDEFINED = 0xFFFFFFFE,
  100.  DW_TIMEOUT_ELAPSED = 0xFFFFFFFD,
  101.  DW_INFINITE = INFINITE,
  102.  THREAD_STOPPED = 0,
  103.  THREAD_RUNNING = 1,
  104.  THREAD_PAUSED = 2,
  105.  THREAD_CONTINUING = 3,
  106.  THREAD_PENDING = 4,
  107.  THREAD_USER_ACTIVITY = 5};
  108. // Construction & Destruction
  109. // @cmember CThread Constructor
  110. CThread(void* pOwnerObject = NULL, LPARAM lParam = 0L);
  111. // @cmember CThread Destructor
  112. virtual ~CThread();
  113. // @cmember Get Thread Attributes
  114. SECURITY_ATTRIBUTES GetAttributes() const;
  115. // @cmember Get Thread Stack Size
  116. DWORD GetStackSize() const;
  117. // @cmember Get Thread Handle
  118. HANDLE GetHandle() const;
  119. // @cmember Get Thread ID
  120. DWORD GetID() const;
  121. // @cmember Get Thread Exit Code
  122. DWORD GetExitCode() const;
  123. // @cmember Get Thread Activity Status
  124. int GetActivityStatus() const;
  125. // @cmember Get WINDOWS Thread Priority
  126. int GetPriority() const;
  127. // @cmember Check if Thread is Alive
  128. BOOL IsAlive();
  129. // Operations && Overridables
  130. #ifdef _DEBUG
  131. virtual void AssertValid() const;
  132. virtual void Dump(CDumpContext& dc) const;
  133. #endif
  134. // @cmember Start Thread
  135. void Start();
  136. // @cmember Fire Run Command
  137. void Run();
  138. // @cmember Fire Pause Command
  139. void Pause();
  140. // @cmember Fire Continue Command
  141. void Continue();
  142. // @cmember Fire Reset Command
  143. void Reset();
  144. // @cmember Fire Stop Command
  145. BOOL Stop(DWORD& dwExitCode, DWORD dwTimeout = CThread::DW_INFINITE);
  146. // @cmember Kill Thread
  147. void Kill(DWORD dwExitCode = CThread::DW_OK);
  148. // @cmember Send Command to Thread
  149. void SendCommand(int nCommand);
  150. // @cmember Cancel All Notification Commands
  151. void ResetCommands();
  152. // @cmember Set Owner Object Parameters
  153. void SetOwnerParams(void* pOwnerObject, LPARAM lParam = 0L);
  154. // @cmember Get Owner Object Parameters
  155. void GetOwnerParams(void*& pOwnerObject, LPARAM& lParam) const;
  156. // @cmember Set Thread Attributes
  157. void SetAttributes(LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL);
  158. // @cmember Set Thread Stack Size
  159. void SetStackSize(DWORD dwStackSize = 0);
  160. // @cmember Set WINDOWS Thread Priority
  161. BOOL SetPriority(int nPriority = THREAD_PRIORITY_NORMAL);
  162. // @cmember Wait For the Desired CThread Activity Status
  163. BOOL WaitForActivityStatus(int nActivityStatus, DWORD dwTimeout = CThread::DW_INFINITE) const;
  164. // @cmember Open Process Synchronization
  165. static void OpenProcessLocking();
  166. // @cmember Close Process Synchronization
  167. static void CloseProcessLocking();
  168. // @cmember Lock Critical Code in Process Synchronization Mode
  169. static void ProcessLock();
  170. // @cmember Unlock Critical Code in Process Synchronization Mode
  171. static void ProcessUnlock();
  172. // Attributes
  173. protected:
  174. // @access <nl>Protected Members:
  175. static enum {CMD_NONE = 0,
  176.  CMD_TIMEOUT_ELAPSED = 1,
  177.  CMD_INITIALIZE = 2,
  178.  CMD_RUN = 3,
  179.  CMD_PAUSE = 4,
  180.  CMD_CONTINUE = 5,
  181.  CMD_RESET = 6,
  182.  CMD_STOP = 7,
  183.  CMD_USER_COMMAND = 8,
  184.  BASE_DELAY_INTERVAL = 100};
  185. BOOL m_bSupportSignalNotification;
  186. BOOL m_bIsSynchronized;
  187. CString m_strThreadHandlerClassName;
  188. // Operations
  189. protected:
  190. // @cmember Set Thread Activity Status
  191. void SetActivityStatus(int nActivityStatus);
  192. // @cmember Lock Critical Code in Thread-Handler-Oriented Synchronization Mode
  193. void Lock();
  194. // @cmember Unlock Critical Code in Thread-Handler-Oriented Synchronization Mode
  195. void Unlock();
  196. // @cmember Wait for Incoming Commands
  197. void WaitForNotification(int& nIncomingCommand, DWORD dwDefaultTimeout = CThread::DW_INFINITE);
  198. // Overridables
  199. protected:
  200. // Main virtual Thread task method implemented in CThread-derived classes...
  201. // The only method that must be implemented in some CThread-derived class.
  202. /////////////////////////////////////////////////////////////////////////////
  203. // @cmember Main Thread Task Handler (Abstract Declaration)
  204. virtual DWORD ThreadHandler() = 0;
  205. /////////////////////////////////////////////////////////////////////////////
  206. //@cmember Make Specific Unallocations After The Thread Has Been Killed
  207. virtual void OnKill();
  208. // Attributes & Operations
  209. private:
  210. class CInternalSynchronization
  211. {
  212. public:
  213. CInternalSynchronization();
  214. ~CInternalSynchronization();
  215. void InternalLock();
  216. void InternalUnlock();
  217. LPCRITICAL_SECTION m_pInternalCriticalSection;
  218. };
  219. friend class CInternalSynchronization;
  220. typedef struct _THREAD_SYNCHRONICITY_TAG
  221. {
  222. CString strThreadHandlerClassName;
  223. LPCRITICAL_SECTION pCriticalSection;
  224. DWORD dwCountOfRunningThreads;
  225. } THREAD_SYNCHRONICITY;
  226. static CList<THREAD_SYNCHRONICITY, THREAD_SYNCHRONICITY&> s_synchronicityList;
  227. static CInternalSynchronization s_InternalThreadSynchronization;
  228. static void ResetSynchronizationList();
  229. static LPCRITICAL_SECTION s_pProcessLockObject;
  230. static DWORD WINAPI ControllingFunction(LPVOID lpParameter);
  231. POSITION m_runtimeSynchronizationObjectPosition;
  232. SECURITY_ATTRIBUTES m_ThreadAttributes;
  233. LPSECURITY_ATTRIBUTES m_lpThreadAttributes;
  234. HANDLE m_hThreadHandle;
  235. HANDLE m_hSignalObject;
  236. DWORD m_dwThreadID;
  237. DWORD m_dwStackSize;
  238. DWORD m_dwThreadExitCode;
  239. volatile int m_nActivityStatus;
  240. void* m_pOwnerObject;
  241. LPARAM m_lParam;
  242. CUIntArray m_nCommandList;
  243. BOOL IsThreadAlive();
  244. BOOL RegisterNotificationObject(CString& strError);
  245. void UnregisterNotificationObject();
  246. BOOL SendThreadCommand(int nCommand, CString& strError);
  247. BOOL ReceiveCommand(int& nIncomingCommand);
  248. void StoreThreadExitCode();
  249. void ResetThreadObject(DWORD dwExitCode);
  250. void ResetThreadRuntimeData();
  251. void ResetSynchronizationObject(THREAD_SYNCHRONICITY& synchronizingObject);
  252. void RegisterRuntimeSynchronization();
  253. void UnregisterRuntimeSynchronization();
  254. void UpdateRuntimeSynchronizationObject(THREAD_SYNCHRONICITY& synchronizingObject);
  255. void DeleteRuntimeSynchronizationObject();
  256. BOOL FindRuntimeSynchronizationObject();
  257. THREAD_SYNCHRONICITY GetRuntimeSynchronizationObject();
  258. };
  259. /////////////////////////////////////////////////////////////////////////////
  260. // Just for AutoDuck purposes...
  261. /////////////////////////////////////////////////////////////////////////////
  262. // @enum CThreadException Predefined Types
  263. // @emem UNKNOWN_ERROR | Exception origin not known.
  264. // @emem CANNOT_CREATE_THREAD | WINDOWS Thread cannot be created.
  265. // @emem THREAD_ALREADY_STARTED | Thread is already started.
  266. // @emem CANNOT_TERMINATE_THREAD | Thread termination failed.
  267. // @emem CANNOT_CREATE_NOTIFICATION_OBJECT | Internal Synchronization error (not enough memory or access denied).
  268. // @emem CANNOT_SIGNAL_NOTIFICATION_OBJECT | Internal Synchronization error (not enough memory or access denied).
  269. // @enum CThread General Predefined Values
  270. // @emem DW_OK | Exception origin not known.
  271. // @emem DW_ERROR | WINDOWS Thread cannot be created.
  272. // @emem DW_UNDEFINED | Thread is already started.
  273. // @emem DW_TIMEOUT_ELAPSED | Thread termination failed.
  274. // @emem DW_INFINITE | Infinite Timeout Interval.
  275. // @enum CThread Activity Status Predefined Values
  276. // @emem THREAD_STOPPED | Thread is stopped.
  277. // @emem THREAD_RUNNING | Thread is running.
  278. // @emem THREAD_PAUSED | Thread is paused.
  279. // @emem THREAD_CONTINUING | Thread is continuing.
  280. // @emem THREAD_PENDING | Thread is pending.
  281. // @emem THREAD_USER_ACTIVITY | Base offset for the user-defined activity status.
  282. // @enum CThread Predefined Commands
  283. // @emem CMD_NONE | No command received.
  284. // @emem CMD_TIMEOUT_ELAPSED | Wait-timeout elapsed (not command).
  285. // @emem CMD_INITIALIZE | Initialize thread task.
  286. // @emem CMD_RUN | Run thread task.
  287. // @emem CMD_PAUSE | Pause thread task.
  288. // @emem CMD_CONTINUE | Continue thread task.
  289. // @emem CMD_RESET | Reset thread task.
  290. // @emem CMD_STOP | Stop thread task and leave controlling function.
  291. // @emem CMD_USER_COMMAND | Base offset for the user-defined command.
  292. /////////////////////////////////////////////////////////////////////////////
  293. //{{AFX_INSERT_LOCATION}}
  294. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  295. #endif // !defined(AFX_THREAD_H__23722BEF_CB24_11D2_BB7B_00104B654EDA__INCLUDED_)