home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / Software / TemaCD / tcvpa / data1.cab / MyFileGroup / INCLUDE / Thread.hpp < prev    next >
C/C++ Source or Header  |  1999-06-03  |  9KB  |  281 lines

  1. #ifndef _INC_THREAD_HPP
  2. #define _INC_THREAD_HPP
  3. class TC_CLock;
  4. class TC_CEvent;
  5. class TC_CGuard;
  6. class TC_CEndGuard;
  7. class TC_CCriticalGuard;
  8. class TC_CCriticalSect;
  9. class TC_CRWAccess;
  10. class TC_CThread;
  11. const long TC_WAIT_INDEFINITE    = 0xFFFFFFFF;
  12. const long TC_WAIT_NONE         = 0;
  13.  
  14. // **********************************************************************
  15. class TC_COREEX_EXPORT TC_CCriticalSect 
  16. {
  17. public:  CRITICAL_SECTION m_Sect ;
  18. public:   TC_CCriticalSect () 
  19. {
  20. InitializeCriticalSection(&m_Sect);
  21. } // end of func
  22. // **********************************************************************
  23.  
  24. public:   ~TC_CCriticalSect ()  ;
  25. public:  void Enter ()  ;
  26. public:  void Leave ()  ;
  27.  
  28. }; // end of class TC_CCriticalSect
  29.  
  30. // **********************************************************************
  31.  
  32. // **********************************************************************
  33. class TC_COREEX_EXPORT TC_CLock 
  34. {
  35. private:  HANDLE m_hMutex ;
  36. public:   TC_CLock (BOOL init_owned = FALSE) 
  37. {
  38. m_hMutex = CreateMutex(NULL, init_owned, NULL);
  39. } // end of func
  40. // **********************************************************************
  41.  
  42. public:   ~TC_CLock ()  ;
  43. public:  BOOL Aquire (long timeout = TC_WAIT_INDEFINITE)  ;
  44. public:  BOOL TryAquire ()  ;
  45. public:  void Release ()  ;
  46.  
  47. }; // end of class TC_CLock
  48.  
  49. // **********************************************************************
  50.  
  51. // **********************************************************************
  52. class TC_COREEX_EXPORT TC_CEvent 
  53. {
  54. private:  HANDLE m_hEvent ;
  55. public:   TC_CEvent (BOOL is_manual = TRUE, BOOL init_set = TRUE) 
  56. {
  57. m_hEvent = CreateEvent(NULL, is_manual, init_set, NULL);
  58. } // end of func
  59. // **********************************************************************
  60.  
  61. public:   ~TC_CEvent ()  ;
  62. public:  BOOL Wait (long timeout = TC_WAIT_INDEFINITE)  ;
  63. public:  BOOL Try ()  ;
  64. public:  void Set ()  ;
  65. public:  void Reset ()  ;
  66. public:  void Pulse ()  ;
  67. public:  HANDLE HEvent ()  ;
  68.  
  69. }; // end of class TC_CEvent
  70.  
  71. // **********************************************************************
  72.  
  73. // **********************************************************************
  74. class TC_COREEX_EXPORT TC_CGuard 
  75. {
  76. private:  TC_CLock * m_Lock ;
  77. public:   TC_CGuard (TC_CLock * lock) 
  78. {
  79. m_Lock = lock;
  80. m_Lock->Aquire(TC_WAIT_INDEFINITE);
  81. } // end of func
  82. // **********************************************************************
  83.  
  84. public:   ~TC_CGuard () 
  85. {
  86. m_Lock->Release();
  87. } // end of func
  88. // **********************************************************************
  89.  
  90.  
  91. }; // end of class TC_CGuard
  92.  
  93. // **********************************************************************
  94.  
  95. // **********************************************************************
  96. class TC_COREEX_EXPORT TC_CEndGuard 
  97. {
  98. private:  TC_CLock * m_Lock ;
  99. public:   TC_CEndGuard (TC_CLock * lock) 
  100. {
  101. m_Lock = lock;
  102.  
  103. } // end of func
  104. // **********************************************************************
  105.  
  106. public:   ~TC_CEndGuard () 
  107. {
  108. m_Lock->Release();
  109. } // end of func
  110. // **********************************************************************
  111.  
  112.  
  113. }; // end of class TC_CEndGuard
  114.  
  115. // **********************************************************************
  116.  
  117. // **********************************************************************
  118. class TC_COREEX_EXPORT TC_CCriticalGuard 
  119. {
  120. private:  static  TC_CLock m_Lock ;
  121. public:   TC_CCriticalGuard () 
  122. {
  123. m_Lock.Aquire();
  124.  
  125. } // end of func
  126. // **********************************************************************
  127.  
  128. public:   ~TC_CCriticalGuard () 
  129. {
  130. m_Lock.Release();
  131. } // end of func
  132. // **********************************************************************
  133.  
  134.  
  135. }; // end of class TC_CCriticalGuard
  136.  
  137. // **********************************************************************
  138.  
  139. // **********************************************************************
  140. class TC_COREEX_EXPORT TC_CRWAccess 
  141. {
  142. private:  TCRWPrivilege m_Privilege ;
  143. private:  TC_CLock m_Lock ;
  144. private:  TC_CEvent m_Event ;
  145. private:  long m_RWorking ;
  146. private:  long m_WWorking ;
  147. private:  long m_RWaiting ;
  148. private:  long m_WWaiting ;
  149. public:   TC_CRWAccess (TCRWPrivilege privilege = R_Privilege)  ;
  150. public:   ~TC_CRWAccess ()  ;
  151. public:  TCRWPrivilege GetPrivilege ()  ;
  152. public:  void SetPrivilege (TCRWPrivilege privilege)  ;
  153. public:  BOOL Request (TCRWRequest request = R_Request, long timeout = TC_WAIT_INDEFINITE, long param=0)  ;
  154. public:  void Release (long param=0)  ;
  155.  
  156. }; // end of class TC_CRWAccess
  157.  
  158. // **********************************************************************
  159. ULONG TC_COREEX_EXPORT tcPrimaryThreadID ()  ;
  160. ULONG TC_COREEX_EXPORT tcCurrentThreadID ()  ;
  161. long tcThreadEntry (TC_CThread * thr)  ;
  162. #define TC_CURRENT_THREAD    TC_CThread::WorkingThread
  163.  
  164. // **********************************************************************
  165. class TC_COREEX_EXPORT TC_CThread 
  166. {
  167. private:
  168.     friend long tcThreadEntry(TC_CThread *thr);
  169. private:  TC_TNameNode<TC_CThread> m_Link ;
  170. private:  static  TC_TNameList<TC_CThread> m_Chain ;
  171. protected:  static  TC_CLock m_CreateLock ;
  172. protected:  static  TC_CEvent m_SyncEvent ;
  173. private:  HANDLE m_Handle ;
  174. protected:  long m_Flags ;
  175. private:  long m_ExitCode ;
  176. public:  TC_CEvent * m_EvTerm ;
  177. public:  BOOL m_AutoDelete ;
  178. public:   TC_CThread (const char* name)  ;
  179. public: virtual  ~TC_CThread ()  ;
  180. protected:   TC_CThread ()  ;
  181. protected:  void Create (const char *name, BOOL is_suspended = FALSE, int stacksize = 0)  ;
  182. public:  long ExitCode () 
  183. {
  184. return m_ExitCode;
  185. } // end of func
  186. // **********************************************************************
  187.  
  188. public:  ULONG GetID () 
  189. {
  190. return (ULONG)m_Link.GetKey(); 
  191. } // end of func
  192. // **********************************************************************
  193.  
  194. public:  const char * GetName ()  ;
  195. public:  HANDLE GetHandle () 
  196. {
  197. return m_Handle;
  198. } // end of func
  199. // **********************************************************************
  200.  
  201. public:  BOOL IsPrimary () 
  202. {
  203. return GetID() == tcPrimaryThreadID();
  204. } // end of func
  205. // **********************************************************************
  206.  
  207. public: static TC_CThread * FindByID (ULONG id)  ;
  208. public: static TC_CThread * FindByName (const char * name)  ;
  209. public: static TC_CThread * FindByHandle (HANDLE handle)  ;
  210. public: static TC_CThread * WorkingThread ()  ;
  211. public: static void Sleep (ULONG msec)  ;
  212. public:  BOOL SetPriority (int priority)  ;
  213. public:  BOOL IsActive ()  ;
  214. public:  BOOL IsAlive ()  ;
  215. public:  BOOL Suspend ()  ;
  216. public:  BOOL Resume ()  ;
  217. public:  BOOL Wait (long timeout = TC_WAIT_INDEFINITE)  ;
  218. public:  void Exit (long exit_code)  ;
  219. public: virtual long Start ()  =0 ;
  220.  
  221. }; // end of class TC_CThread
  222.  
  223. // **********************************************************************
  224.  
  225. // **********************************************************************
  226. class TC_COREEX_EXPORT TC_CThreadAction 
  227. {
  228. public:   TC_CThreadAction ()  ;
  229. public: virtual  ~TC_CThreadAction ()  ;
  230. public: virtual long Run ()  =0 ;
  231.  
  232. }; // end of class TC_CThreadAction
  233.  
  234. // **********************************************************************
  235.  
  236. // **********************************************************************
  237.  template <class T>
  238. class TC_TThreadAction 
  239.     : public TC_CThreadAction
  240. {
  241. typedef long (T::*THREAD_FUNC)();
  242. private:  T* m_Obj ;
  243. private:  THREAD_FUNC m_Func ;
  244. public:   TC_TThreadAction (T* obj, THREAD_FUNC func) 
  245. {
  246. m_Obj = obj;
  247. m_Func = func;
  248. } // end of func
  249. // **********************************************************************
  250.  
  251. public:   ~TC_TThreadAction () 
  252. {
  253. } // end of func
  254. // **********************************************************************
  255.  
  256. public:  long Run () 
  257. {
  258. return (m_Obj->*m_Func)();
  259. } // end of func
  260. // **********************************************************************
  261.  
  262.  
  263. }; // end of class TC_TThreadAction
  264.  
  265. // **********************************************************************
  266.  
  267. // **********************************************************************
  268. class TC_COREEX_EXPORT TC_CInstThread 
  269.     : public TC_CThread
  270. {
  271. protected:  TC_CThreadAction* m_Action ;
  272. public:   TC_CInstThread (char * name, TC_CThreadAction * action, BOOL is_suspended, BOOL is_autodelete)  ;
  273. public:   ~TC_CInstThread ()  ;
  274. public:  long Start ()  ;
  275.  
  276. }; // end of class TC_CInstThread
  277.  
  278. // **********************************************************************
  279.  
  280. #endif // _INC_THREAD_HPP
  281.