acl  3.5.3.0
aio_timer_callback.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <list>
4 #include "aio_delay_free.hpp"
5 
6 namespace acl
7 {
8 
9 class aio_timer_task;
10 class aio_handle;
11 
12 /**
13  * 定时器的回调类
14  */
16 {
17 public:
18  /**
19  * 构造函数
20  * @param keep {bool} 该定时器是否允许自动重启
21  */
22  aio_timer_callback(bool keep = false);
23  virtual ~aio_timer_callback(void);
24 
25  /**
26  * 当定时器里的任务数为空时的回调函数,
27  * 子类可以在其中释放,一旦该函数被调用,
28  * 则意味着该定时器及其中的所有定时任务都从
29  * 定时器集合中被删除
30  * 该函数被触发的条件有三个:
31  * 1) 定时器所有的任务数为 0 时(如,
32  * del_timer(aio_timer_callback*, unsigned int) 被
33  * 调用且任务数为 0 时)
34  * 2) 当 aio_handle 没有设置重复定时器且该定时器中
35  * 有一个定时任务被触发后
36  * 3) 当 del_timer(aio_timer_callback*) 被调用后
37  */
38  virtual void destroy(void) {}
39 
40  /**
41  * 定时器里的任务是否为空
42  * @return {bool}
43  */
44  bool empty(void) const;
45 
46  /**
47  * 定时器里的任务个数
48  * @return {size_t}
49  */
50  size_t length(void) const;
51 
52  /**
53  * 该定时器是否是自动重启的
54  * @param on {bool}
55  */
56  void keep_timer(bool on);
57 
58  /**
59  * 判断该定时器是否是自动重启的
60  * @return {bool}
61  */
62  bool keep_timer(void) const;
63 
64  /**
65  * 清空定时器里的定时任务
66  * @return {int} 被清除的定时任务的个数
67  */
68  int clear(void);
69 
70 protected:
71  friend class aio_handle;
72 
73  /**
74  * 子类必须实现此回调函数,注:子类或调用者禁止在
75  * timer_callback 内部调用 aio_timer_callback 的析构
76  * 函数,否则将会酿成大祸
77  * @param id {unsigned int} 对应某个任务的 ID 号
78  */
79  virtual void timer_callback(unsigned int id) = 0;
80 
81  /****************************************************************/
82  /* 子类可以调用如下函数添加一些新的定时器任务 ID 号 */
83  /****************************************************************/
84 #if defined(_WIN32) || defined(_WIN64)
85  __int64 present_;
86 
87  /**
88  * 针对本定时器增加新的任务ID号,这样便可以通过一个定时器启动
89  * 多个定时任务
90  * @param id {unsigned int} 定时器定时任务ID号
91  * @param delay {__int64} 每隔多久自动触发该定时器,同时将对应的定时器定时
92  * 任务ID号传回(微秒级)
93  * @return {__int64} 距离本定时器的第一个将会触发的定时任务ID还多久(微秒级)
94  */
95  __int64 set_task(unsigned int id, __int64 delay);
96 
97  /**
98  * 删除定时器中某个消息ID对应的定时任务
99  * @param {unsigned int} 定时任务ID
100  * @return {__int64} 距离本定时器的第一个将会触发的定时任务ID还多久(微秒级)
101  */
102  __int64 del_task(unsigned int id);
103 #else
104  long long int present_;
105  long long int set_task(unsigned int id, long long int delay);
106  long long int del_task(unsigned int id);
107 #endif
108 
109  /**
110  * 设置当前定时器的时间截
111  */
112  void set_time(void);
113 
114 private:
115  aio_handle* handle_;
116  size_t length_;
117  std::list<aio_timer_task*> tasks_;
118  bool keep_; // 该定时器是否允许自动重启
119  bool destroy_on_unlock_; // 解锁后是否 destroy
120 #if defined(_WIN32) || defined(_WIN64)
121  __int64 set_task(aio_timer_task* task);
122  __int64 trigger(void);
123 #else
124  long long int set_task(aio_timer_task* task);
125  long long int trigger(void);
126 #endif
127 };
128 
129 } // namespace acl
virtual void destroy(void)
#define ACL_CPP_API