Thread.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. //
  2. // "$Id: Thread.h 107129 2013-03-20 10:29:35Z qin_fenglin $"
  3. //
  4. // Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
  5. // All Rights Reserved.
  6. //
  7. // Description:
  8. // Revisions: Year-Month-Day SVN-Author Modification
  9. //
  10. #ifndef _INFRA3_THREAD_H_
  11. #define _INFRA3_THREAD_H_
  12. #include <string>
  13. #include "Defs.h"
  14. #include "String.h"
  15. #include "Function.h"
  16. namespace Dahua{
  17. namespace Infra{
  18. struct ThreadInternal;
  19. /// \class CThread
  20. /// \brief 多平台线程类; 提供继承方式创建线程
  21. /// \see CThreadManager
  22. class INFRA_API CThread
  23. {
  24. CThread(CThread const&);
  25. CThread& operator=(CThread const&);
  26. public:
  27. enum Priority
  28. {
  29. priorTop = 1,
  30. priorBottom = 127,
  31. priorDefault = 64,
  32. };
  33. enum Policy
  34. {
  35. policyNormal = 0, ///< 普通线程
  36. policyRealtime = 1 ///< 实时线程
  37. };
  38. /// 构造函数,并没有创建系统线程
  39. /// \param name 线程名称字符串,名称不一定会传给操作系统,但CThreadManager
  40. /// 管理线程时会用到。
  41. /// \param priority 线程优先级,值越小表示优先级越高,会被转化成对应操作系统
  42. /// 平台的优先级。取值priorTop到priorBottom,默认值priorDefault。
  43. /// \param policy 线程调度策略
  44. /// \param stackSize 为线程指定的堆栈大小,如果等于0或者小于平台要求必须的值,
  45. /// 则使用平台缺省值。
  46. CThread(const char* name, int priority = priorDefault, int policy = policyNormal, int stackSize = 0);
  47. /// 析构函数,如果线程还在执行,会销毁线程
  48. virtual ~CThread();
  49. /// 线程执行体,是一个虚函数,派生的线程类中重载此函数,实现各自的行为。
  50. virtual void threadProc() = 0;
  51. /// 创建线程
  52. bool createThread();
  53. /// 销毁线程,设置退出标志,线程的执行体需要在各退出点判断这个标志。
  54. bool destroyThread();
  55. /// 终止线程,和销毁线程不同在于它是由操作系统强制销毁线程,不保证用户数据安全。
  56. bool terminateThread();
  57. /// 取消线程,设置线程退出标志,非阻塞方式,不等待线程结束
  58. bool cancelThread();
  59. /// 判断线程已经结束还是正在执行
  60. bool isThreadOver();
  61. /// 得到线程ID
  62. int getThreadID();
  63. /// 设置线程名称
  64. /// \param name 新的线程名称
  65. void setThreadName(const char * name);
  66. /// 套接字共享接口,对pSOS操作系统调用系统接口返回共享得到的一个引用套接字
  67. /// 对于其他操作系统,直接返回传入的套接字
  68. /// \param socket 需要共享的原始套接字
  69. /// \return 共享后的引用套接字
  70. int shareSocket(int socket);
  71. /// 设置超时时间
  72. /// \param milliSeconds 超时毫秒数,设置为0表示清空设置
  73. void setTimeout(int milliSeconds);
  74. /// 设置超时时间,主要用于优化继承类中实现,减少重复获取当前时间的开销
  75. /// \param [in] milliSeconds 超期时间(以毫秒记)
  76. /// \param [in] now 当前时间(以毫秒记)
  77. void setTimeout(int milliSeconds, uint64_t now);
  78. /// 判断是否超时,也就是判断从最后一次SetTimeout到这次调用IsTimeout的时间间隔
  79. /// 是否已经在超时时间之外。这两个接口目的是提供给用户监视和调度线程的方法,
  80. /// CThread类并不会根据是否超时对线程执行做任何干预。CThreadManager打印所有
  81. /// 线程状态时会调用这个接口。
  82. bool isTimeout();
  83. /// 线程退出标志, 线程体根据这个标志退出
  84. bool looping() const;
  85. /// 得到调用线程的ID,而不是某个线程对象的ID,是一个静态函数。
  86. static int getCurrentThreadID();
  87. /// 设置当前线程超时时间
  88. /// \param milliSeconds 超时毫秒数,设置为0表示清空设置
  89. static bool setCurrentTimeout(int milliSeconds);
  90. /// 让调用线程阻塞一段时间
  91. /// \param milliSeconds 期望阻塞的毫秒数
  92. static void sleep(int milliSeconds);
  93. /// 调节调用线程CPU负载,避免较长的运算过程占用CPU,影响其他线程,在运行过程前后使用。
  94. /// \param 占用CPU的时间,取值1~100,1表示最慢速度,100表示正常速度。
  95. /// \note linux内部使用信号实现,因此要保证运算过程不应该有select之类会被信号唤醒的函数调用。
  96. static void load(int percent);
  97. private:
  98. ThreadInternal* m_internal;
  99. };
  100. ////////////////////////////////////////////////////////////////////////////////
  101. struct ThreadLiteInternal;
  102. /// \class CThreadLite
  103. /// \brief 多平台线程类; 提供组合方式创建线程
  104. /// \see CThreadManager
  105. class INFRA_API CThreadLite : public CThread
  106. {
  107. CThreadLite(CThreadLite const&);
  108. CThreadLite& operator=(CThreadLite const&);
  109. public:
  110. /// 线程执行体, 参数为线程对象的引用
  111. typedef TFunction1<void, CThreadLite&> ThreadProc;
  112. /// 构造函数,并没有创建系统线程
  113. /// \param proc 线程体函数
  114. /// \param name 线程名称字符串,名称不一定会传给操作系统,但CThreadManager
  115. /// 管理线程时会用到。
  116. /// \param priority 线程优先级,值越小表示优先级越高,会被转化成对应操作系统
  117. /// 平台的优先级。取值priorTop到priorBottom,默认值priorDefault。
  118. /// \param policy 线程调度策略
  119. /// \param stackSize 为线程指定的堆栈大小,如果等于0或者小于平台要求必须的值,
  120. /// 则使用平台缺省值。
  121. CThreadLite(ThreadProc proc, const char* name, int priority = priorDefault, int policy = policyNormal, int stackSize = 0);
  122. /// 析构函数,如果线程还在执行,会销毁线程
  123. virtual ~CThreadLite();
  124. private:
  125. /// 线程执行体
  126. virtual void threadProc();
  127. ThreadLiteInternal *m_internal;
  128. };
  129. ////////////////////////////////////////////////////////////////////////////////
  130. struct ThreadManagerInternal;
  131. /// \class IThreadManager
  132. /// \brief 线程管理类
  133. /// \see CThread
  134. class INFRA_API CThreadManager
  135. {
  136. CThreadManager();
  137. CThreadManager(CThreadManager const&);
  138. CThreadManager& operator=(CThreadManager const&);
  139. public:
  140. /// 单件
  141. static CThreadManager* instance();
  142. /// 析构函数
  143. ~CThreadManager();
  144. /// 注册主线程,只能在主线程中调用,这样在显示所有线程的信息是也可以看到主线程信息
  145. void registerMainThread();
  146. /// 打印所有线程信息
  147. void dumpThreads();
  148. /// 通过线程id获取线程名称
  149. /// \param [in] id 线程id
  150. /// \name [out] 线程名称
  151. /// \return true 成功
  152. /// \return false 失败
  153. bool getThreadNameByID(int32_t id, CString& name);
  154. /// 得到超时的线程名称
  155. bool getTimeOutThreads(CString2& names);
  156. ///\brief 线程队列中是否已存在此线程
  157. ///\param [in] id 需要检测的线程id
  158. ///\return TRUE表示此线程在队列中,否则表示不存在
  159. bool hasThread(int id);
  160. private:
  161. ThreadManagerInternal* m_internal;
  162. };
  163. } // namespace Infra
  164. } // namespace Dahua
  165. #endif //_INFRA_THREAD_H_