我是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");
}
}发布于 2016-11-21 15:32:15
抛开您的示例不谈,libuv提供了多次运行循环的机会。
有关更多详细信息,请参阅documentation。
特别是,uv_run函数接受uv_run_mode类型的参数。
可能的值包括:
UV_RUN_DEFAULT:它不会停止,除非您显式地停止它,直到在loop.UV_RUN_ONCE:轮询I/O一次并执行所有准备好提供服务的函数之前,它至少存在于被引用或活动的资源上。它的缺点是,如果没有挂起的callbacks.UV_RUN_NOWAIT:,它就会阻塞这可能是您正在寻找的回调,类似于前面的回调,但如果没有挂起的回调,它就不会阻塞。请注意,对于UV_RUN_ONCE和UV_RUN_NOWAIT,您必须多次运行循环。
返回值通常表示是否有其他挂起的回调。在这种情况下,循环迟早都要在将来运行。
最后一个模式,UV_RUN_NOWAIT,可能就是您要找的模式。
例如,它可以用于客户端有自己的循环并且不能阻塞libuv的循环的场景。
循环运行多次是正常的吗?
嗯,是的,但这主要取决于你的实际问题是否正确。
很难从100行的代码片段中判断出来。
https://stackoverflow.com/questions/40130897
复制相似问题