2016-10-19 44 views
1

我是uvlib的新手。如果想避免內部功能被阻塞,兩次調用uv_run是否正常?如果沒有,那麼哪些工具可用,線程除外?在這裏我只是打開和關閉文件。幾次調用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"); 
    } 
} 

回答

1

拋開你的榜樣,libuv提供了機會,運行循環多次。
查看documentation瞭解更多詳情。

特別地,uv_run函數接受類型爲uv_run_mode的參數。
可能的值是:

  • UV_RUN_DEFAULT:它不會停止,除非你明確地制止,直到至少存在於在循環中引用或活動的資源。

  • UV_RUN_ONCE:輪詢一次I/O並執行所有準備好服務的功能。如果沒有待處理的回調,它具有阻塞的缺點。

  • UV_RUN_NOWAIT:這可能是您正在尋找的那個,與上一個類似,但是如果沒有掛起的回調,它不會阻止。

注意,既UV_RUN_ONCEUV_RUN_NOWAIT你必須運行循環多次。
返回值通常表示是否還有其他未決回調。在這種情況下,循環必須在將來遲早運行。

最後的模式,UV_RUN_NOWAIT,可能是你正在尋找的。
作爲一個例子,它可以用於客戶端有自己的循環並且不能在libuv上阻塞的場景。


多次運行循環是否正常?
嗯,是的,但它主要取決於你的實際問題,如果它是正確的。
從SO上的100行代碼很難說。

相關問題