libuv计时器

1、uv_timer_t - 计时器句柄

使用该类型句柄来调用计时器回调

2、API

2.1、uv_timer_init

int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle)

初始化计时器句柄

2.2、uv_timer_start

int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat)
void (*uv_timer_cb)(uv_timer_t* handle)

开始计时器,timeoutrepeat 都是以 ms 作为单位

如果 timeout 为 0,则回调函数在下次时间迭代中执行,如果非0,则回调函数会在 timeout 后第一次执行,接下来每次在 repeat 后执行

2.3、uv_timer_stop

int uv_timer_stop(uv_timer_t* handle)

停止计时器,回调函数不会再执行

2.4、uv_timer_again

int uv_timer_again(uv_timer_t* handle)

停止计时器,如果计时器已经开始并正在正在重复执行,则使用 repeat 作为 timeout 重启,若计时器还没有开始,则返回 UV_EINVAL

2.5、uv_timer_set_repeat

void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat)

设置计时器的 repeat 值,计时器会根据该值进行调度

如果 repeat 为50ms,首次运行了17ms,则33ms后会再次运行。而如果有其他任务占用,超出了33ms,则之后回调函数会尽快去执行

2.6、uv_timer_get_repeat

uint64_t uv_timer_get_repeat(const uv_timer_t* handle)

返回 repeat

2.7、uv_timer_get_due_in

uint64_t uv_timer_get_due_in(const uv_timer_t* handle)

获取计时器的到期值,这个值是相对于 uv_now()

如果计时器失效,则返回0

3、代码示例

void timerCB(uv_timer_t *handle) {
  auto value = (long long) handle->data;
  cout << value << endl;
  if (value >= 126) {
    uv_timer_stop(handle);
    return;
  }
  handle->data = (void *) ++value;
}

int main() {

  uv_loop_t *loop = uv_default_loop();

  uv_timer_t timer;
  uv_timer_init(loop, &timer);

  timer.data = (void *) 123;
  uv_timer_start(&timer, timerCB, 1000, 4000);

  uv_run(loop, UV_RUN_DEFAULT);

  return 0;
}
原文地址:https://www.cnblogs.com/sherlock-lin/p/14426653.html