我是uvlib
的新手。如果想要避免阻止内部函数,请调用uv_run
两次是否正常?如果没有,那么哪些仪器可用,除了线程?这里我只是打开并关闭文件。
#include <uv.h>
#include <stdio.h>
#include <fcntl.h>
#include <conio.h>
#ifdef _WIN32
#include <conio.h>
#include <Windows.h>
#define Sleep(x) Sleep(x)
#else
#include <unistd.h>
#define Sleep(x) sleep(x)
#endif
uv_loop_t* loop;
uv_fs_t open_req;
uv_fs_t close_req;
void open_cb(uv_fs_t*);
void close_cb(uv_fs_t*);
const char *filename = "C:/c/somedata.txt";
int main(int argc, char **argv) {
int r;
loop = uv_loop_new();
r = uv_fs_open(loop, &open_req, filename, O_RDONLY, S_IREAD, open_cb);
if (r < 0) {
printf("Error at opening file: %s\n", uv_strerror(r));
}
printf("in main now\n");
uv_run(loop, UV_RUN_DEFAULT);
uv_loop_close(loop);
return 0;
}
void open_cb(uv_fs_t* req) {
int result = req->result;
if (result < 0) {
printf("Error at opening file: %s\n", uv_strerror(result));
} else {
printf("Successfully opened file.\n");
}
uv_fs_req_cleanup(req);
uv_fs_close(loop, &close_req, result, close_cb);
uv_run(loop, UV_RUN_DEFAULT);
Sleep(5000);
printf("ok now\n");
}
void close_cb(uv_fs_t* req) {
int result = req->result;
printf("in close_cb now\n");
if (result < 0) {
printf("Error at closing file: %s\n", uv_strerror(result));
} else {
printf("Successfully closed file.\n");
}
}
答案 0 :(得分:1)
抛开您的示例,libuv
提供了多次运行循环的机会。
有关详细信息,请参阅documentation。
特别是,uv_run
函数接受uv_run_mode
类型的参数
可能的值有:
UV_RUN_DEFAULT
:它不会停止,除非您明确停止它,直到循环中至少存在被引用或活动的资源。
UV_RUN_ONCE
:对I / O进行一次轮询并执行所有准备提供的功能。它的缺点是,如果没有待处理的回调,它就会阻塞。
UV_RUN_NOWAIT
:这可能是你要找的那个,类似于前一个,但如果没有待处理的回调,它就不会阻止。
请注意,对于UV_RUN_ONCE
和UV_RUN_NOWAIT
,您必须多次运行循环。
返回值通常表示是否还有其他待处理的回调。在这种情况下,循环必须迟早运行。
最后一种模式UV_RUN_NOWAIT
可能是您正在寻找的模式
例如,它可以用在客户端有自己的循环并且不能阻止libuv的循环的场景中。
多次运行循环是否正常? 嗯,是的,但这主要取决于你的实际问题,如果它是对的 从SO的100行代码片段来说很难说。