索引目录:https://blog.csdn.net/knowledgebao/article/details/84776754
libuv的loop为提供了相当大的用户控制权,您可以通过处理多个循环来实现有趣的结果。您还可以将libuv的事件循环嵌入到另一个基于事件循环的库中 - 想象一下基于Qt的UI,以及Qt的事件循环驱动一个libuv后端,让它执行密集的系统级任务。
libuv提供一个uv_stop函数,用于停止loop的执行,当然uv_stop不会让loop立刻停止,而是通过设置stop_flag来控制loop的执行,具体可以参考https://blog.csdn.net/knowledgebao/article/details/82251513。
下边做一个简单说明:
}
}
int uv_is_closing(const uv_handle_t* handle) {
return uv__is_closing(handle);
}
int uv_backend_fd(const uv_loop_t* loop) {
return loop->backend_fd;
}
int uv_backend_timeout(const uv_loop_t* loop) {
if (loop->stop_flag != 0)
return 0;
if (!uv__has_active_handles(loop) && !uv__has_active_reqs(loop))
return 0;
stop_flag被设置的时候,循环可能在任何一个位置,stop_flag的作用
使uv_backend_timeout()
返回0
,保证循环不会阻塞。在最后正常退出。如果stop_flag在
uv_backend_timeout()之后设置,下一轮才会生效。如果stop_flag在uv_backend_timeout()之前设置,本轮循环的部分逻辑也会正常执行,并且正常触发回调。
下边给出一个uv_stop的例子,可以看看是否和预期一致。
#include <stdio.h>
#include <uv.h>
int64_t counter = 0;
void idle_cb(uv_idle_t *handle) {
printf("Idle callback\n");
counter++;
if (counter >= 5) {
uv_stop(uv_default_loop());
printf("uv_stop() called\n");
}
}
void prep_cb(uv_prepare_t *handle) {
printf("Prep callback\n");
}
int main() {
uv_idle_t idler;
uv_prepare_t prep;
uv_idle_init(uv_default_loop(), &idler);
uv_idle_start(&idler, idle_cb);
uv_prepare_init(uv_default_loop(), &prep);
uv_prepare_start(&prep, prep_cb);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
return 0;
}