2016-10-19 6 views
1

私はuvlibを初めて利用しています。内部機能をブロックしたくない場合は、uv_runを2回呼び出すのは正常ですか?そうでない場合は、スレッドを除き、どの楽器が利用可能ですか?ここではファイルを開いて閉じます。わきあなたの例を設定し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:ループ上の参照またはアクティブなリソースに少なくとも存在するまで、明示的に停止しない限り、それは停止しません。

  • :I/Oを一度ポーリングして、提供可能なすべての機能を実行します。保留中のコールバックがないとブロックされてしまうという欠点があります。

  • UV_RUN_NOWAIT:これはおそらく以前のものと似ていますが、保留中のコールバックがないとブロックしません。

UV_RUN_ONCEUV_RUN_NOWAITの両方で使用すると、複数回ループを実行する必要がありますので注意してください。
戻り値は通常、他の保留中のコールバックがあるかどうかを示します。この場合、ループは将来遅かれ早かれ実行する必要があります。

最後のモード、UV_RUN_NOWAITは、おそらくあなたが探しているものです。
例として、クライアントが独自のループを持ち、libuvのループをブロックできないシナリオで使用できます。


ループを複数回実行するのは正常ですか?
さて、そうですが、実際に問題が発生した場合は、実際の問題に大きく左右されます。
SOの100行スニペットからは言い難いです。

関連する問題