Timer.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //
  2. // "$Id: Timer.h 130874 2013-08-09 00:50:14Z 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_TIMER_H_
  11. #define _INFRA3_TIMER_H_
  12. #include "Defs.h"
  13. #include "Function.h"
  14. namespace Dahua{
  15. namespace Infra{
  16. struct TimerInternal;
  17. /// \class CTimer
  18. /// \brief 多平台定时器,支持延时、周期、异步等多种过程执行方式
  19. ///
  20. /// 每次调用都是从线程池中取一个线程执行,所以多个的定时器的执行不会有直接影响,
  21. /// 但是同一个定时器的上次调用还没有执行完毕,则下次调用会失败。
  22. /// \see CTimerManager
  23. class INFRA_API CTimer
  24. {
  25. CTimer(CTimer const&);
  26. CTimer& operator=(CTimer const&);
  27. public:
  28. typedef TFunction1<void, unsigned long> Proc;
  29. /// 构造函数
  30. /// \param name 定时器名称
  31. CTimer(const char * name);
  32. /// 析构函数
  33. virtual ~CTimer();
  34. /// 启动定时器
  35. /// \param fun 定时器回调函数
  36. /// \param delay 指定启动后延时多少时间调用,单位为毫秒,如果为0表示立即开始调用
  37. /// \param period 定时器的周期,指定距上次调用多少时间后再次调用,单位为毫秒,
  38. /// 如果为0表示是非周期定时器,第一次调用完毕后会自动停止。
  39. /// \param param 回调函数参数,在回调被触发是会传给回调函数。
  40. /// \param timeout 回调函数执行的超时时间,这个时间会被设置给回调时的定时器线程,
  41. /// 毫秒为单位。0表示永不超时,默认值为1分钟。
  42. /// \return 在非延时的定时器的上次调用还没有完成的情况下返回false,其他情况返回true
  43. /// \note 把延时参数和周期参数都设置为0,即可实现异步调用。
  44. bool start(Proc fun, uint32_t delay, uint32_t period, unsigned long param = 0, uint32_t timeout = 60000);
  45. /// 关闭定时器
  46. /// \param callNow 定时器停止时同时再调用一下回调函数,只对带延时的非周期定时器有效。
  47. /// \return 定时器没有开启的情况下调用停止会返回false
  48. bool stop(bool callNow = false);
  49. /// 得到定时器名称
  50. const char* getName();
  51. /// 设置定时器名称
  52. /// \name 新的定时器名称
  53. void setName(const char* name);
  54. /// 判断定时器是否开启
  55. /// \note 非周期定时器在调用过后会自动将状态关闭
  56. bool isStarted();
  57. /// 判断非周期定时器是否已经调用过
  58. bool isCalled();
  59. /// 判断回调函数是否正在执行
  60. bool isRunning();
  61. /// 关闭定时器并等待,直到回调函数结束才返回。
  62. /// \note 一般在用户类析构的时候调用,调用要特别小心,防止死锁。
  63. bool stopAndWait();
  64. ///\brief 重新设置定时器执行周期
  65. ///\param [in] pertime 需要重新设置的执行周期
  66. void setPeriodTime(unsigned int pertime);
  67. ///\brief 开启统计
  68. void enableStat(bool bStat=true);
  69. private:
  70. TimerInternal* m_internal;
  71. };
  72. ////////////////////////////////////////////////////////////////////////////////
  73. struct TimerManagerInternal;
  74. /// \class CTimerManager
  75. /// \brief 定时器管理类,使用高精度系统定时其来驱动应用定时器工作
  76. ///
  77. /// 高精度定时器每次被触发时,检查所有应用定时器的状态,决定是否调用其回调函数。
  78. /// 这个定时器的周期也决定了应用定时器的精度。
  79. /// - Win32使用多媒体定时器,周期为1ms
  80. /// - pSOS使用tmdlTimer组件,周期为1ms
  81. /// - ucLinux2.4 使用系统信号,周期为10ms
  82. /// \see CTimer
  83. class INFRA_API CTimerManager
  84. {
  85. CTimerManager();
  86. CTimerManager(CTimerManager const&);
  87. CTimerManager& operator=(CTimerManager const&);
  88. public:
  89. /// 创建定时器管理对象
  90. static CTimerManager* instance();
  91. /// 析构函数
  92. ~CTimerManager();
  93. /// 打印所有线程信息
  94. void dumpTimers();
  95. /// 限制线程池空闲线程数
  96. bool limitIdlePooled(int count);
  97. private:
  98. TimerManagerInternal* m_internal;
  99. };
  100. } // namespace Infra
  101. } // namespace Dahua
  102. #endif