名称
zmq_timers - 跨平台定时器回调的辅助函数
概要
typedef void(zmq_timer_fn) (int 'timer_id', void *'arg');
void *zmq_timers_new (void);
int zmq_timers_destroy (void **'timers_p');*
int zmq_timers_add (void *'timers', size_t 'interval', zmq_timer_fn 'handler', void *'arg');
int zmq_timers_cancel (void *'timers', int 'timer_id');
int zmq_timers_set_interval (void *'timers', int 'timer_id', size_t 'interval');
int zmq_timers_reset (void *'timers', int 'timer_id');
long zmq_timers_timeout (void *'timers');
int zmq_timers_execute (void *'timers');
描述
zmq_timers 系列函数提供跨平台访问定时器回调的功能。定时器注册后,会按指定的间隔重复触发,直到被手动取消。要运行回调,必须调用 zmq_timers_execute。
zmq_timers_new 和 zmq_timers_destroy 管理定时器实例的生命周期。zmq_timers_new 创建并返回一个新的定时器实例,而 zmq_timers_destroy 销毁它。必须将指向有效定时器的指针作为 zmq_timers_destroy 的 timers_p 参数传入。特别地,对于同一个定时器实例,zmq_timers_destroy 不可以被多次调用。成功执行时,zmq_timers_destroy 会将传入的指针设置为 NULL。
zmq_timers_add 和 zmq_timers_cancel 管理已注册的定时器。
zmq_timers_add 为给定实例注册一个新的*定时器*。*timers* 必须指向一个有效的 *timers* 对象。*interval* 参数指定定时器的过期时间,单位为毫秒。*handler* 和 *arg* 指定过期时将调用的回调函数以及可选的透传参数。回调必须是实现 zmq_timer_fn 原型的有效函数。函数将返回一个 ID,可用于修改或取消定时器。
zmq_timers_cancel 将取消实例 timers 中与 timer_id 关联的定时器。
zmq_timers_set_interval 将实例 timers 中与 timer_id 关联的定时器的过期时间设置为从现在起 interval 毫秒之后。
zmq_timers_reset 将重新启动实例 timers 中与 timer_id 关联的定时器。
zmq_timers_timeout 将返回注册到 timers 中的下一个即将过期的定时器剩余的时间,单位为毫秒。
zmq_timers_execute 将运行实例 timers 中所有已过期定时器的回调函数。
线程安全
与大多数其他 0MQ 对象一样,定时器不是线程安全的。所有操作必须从同一线程调用。否则,行为是未定义的。
返回值
zmq_timers_new 总是返回指向一个定时器的有效指针。
所有返回 int 类型的函数在失败时返回 -1。在这种情况下,可以使用 zmq_errno() 查询错误类型,如下所述。
zmq_timers_timeout 返回注册到 timers 中的下一个即将过期的定时器剩余的时间,单位为毫秒;如果没有剩余的定时器,则返回 -1。
所有其他函数在成功执行时返回 0。
错误
对于 zmq_timers_destroy、zmq_timers_cancel、zmq_timers_set_interval、zmq_timers_reset、zmq_timers_timeout 和 zmq_timers_execute:EFAULT:: timers 没有指向有效的定时器。请注意,传递无效指针(例如,指向已释放内存的指针)可能导致未定义的行为(例如,访问冲突)。
对于 zmq_timers_add:EFAULT:: timers 没有指向有效的定时器,或者 handler 没有指向有效的函数。
对于 zmq_timers_cancel、zmq_timers_set_interval 和 zmq_timers_timeout:EINVAL:: timer_id 不存在或已被取消。
示例
void handler (int timer_id_, void *arg_)
{
(void) timer_id_; // Stop 'unused' compiler warnings
*((bool *) arg_) = true;
}
...
void *timers = zmq_timers_new ();
assert (timers);
bool timer_invoked = false;
const unsigned long full_timeout = 100;
int timer_id =
zmq_timers_add (timers, full_timeout, handler, &timer_invoked);
assert (timer_id);
// Timer should not have been invoked yet
int rc = zmq_timers_execute (timers);
assert (rc == 0);
// Wait half the time and check again
long timeout = zmq_timers_timeout (timers);
assert (rc != -1);
msleep (timeout / 2);
rc = zmq_timers_execute (timers);
assert (rc == 0);
// Wait until the end
rc = msleep (zmq_timers_timeout (timers));
assert (rc == 0);
// The handler will be executed
rc = zmq_timers_execute (timers);
assert (rc == 0);
assert (timer_invoked);
rc = zmq_timers_destroy (&timers);
assert (rc == 0);
另请参阅
作者
此页面由 0MQ 社区编写。要做出修改,请阅读 0MQ 贡献政策:https://zeromq.cn/how-to-contribute/。