3

serverが呼び出された後、新しいスレッドで開始されstartます (サーバーには独自のループがあります)。問題は、デフォルトループにイベントが登録されていないため、プログラムがすぐに終了することです。私が欲しいのは、をpthread_join介してシミュレートすることuv_default_loopです。joinメインスレッドを維持するために、個別のスレッドで実行する必要があるすべてのオブジェクトでカスタムメソッドを呼び出さないようにしたい。

main 関数の重要な部分:

int main(int argc, const char * argv[])
{
    ...
    TcpServer server("127.0.0.1", 7777);   
    server.start();
    uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    uv_loop_close(uv_default_loop());
    return 0;
}

主な機能:

int main(int argc, const char * argv[])
{
    /* initialize openssl random generator */
    const char * seed = "asfanfasfflalkhflhafoih";
    RAND_seed(seed, (size_t)strlen(seed));

    uv_tty_t tty;
    uv_tty_init(uv_default_loop(), &tty, 0, 1);
    uv_tty_set_mode(&tty, 0);
    uv_read_start((uv_stream_t *)&tty, allocateBuffer_cb, tty_read_cb);

    // unref tty, it shouldn't keep the loop alive
    uv_unref((uv_handle_t *)&tty);

    uv_signal_t sigterm;
    uv_signal_init(uv_default_loop(), &sigterm);
    uv_signal_start(&sigterm, signal_handler, SIGTERM);

    uv_signal_t sigint;
    uv_signal_init(uv_default_loop(), &sigint);
    uv_signal_start(&sigint, signal_handler, SIGINT);

    // unref signal handlers, they shoudn't keep the loop alive
    uv_unref((uv_handle_t * )&sigterm);
    uv_unref((uv_handle_t * )&sigint);

    TcpServer server("127.0.0.1", 7777, uv_default_loop());

    server.start();

    uv_run(uv_default_loop(), UV_RUN_DEFAULT);

    uv_loop_close(uv_default_loop());

    // we should reset tty before end
    uv_tty_reset_mode();

    return 0;
}

解決済み:私はこのトピックを見つけました。これは本当に 良いです
https://groups.google.com/forum/#!topic/nodejs/Sob97-QbtlA少なくとも 1 つのアクティブなスレッドがあります。スレッドが終了する必要がある場合は、おそらくそれだけで、メイン ループに登録されます。uv_async_tuv_default_loop()uv_closeuv_async_t

4

1 に答える 1

-3

私はテストしていませんが、この方法を試すことはできますか?

uv_runこのように無限ループに入れます。

while(someflag)
{
    uv_run( uv_default_loop );
}

そして、このループをスレッドに入れます。uv_loop にイベントが登録されていない場合は、 until を呼び出しuv_runますsomeflag == false。したがって、uv_async_sendまたは他の方法を使用して、このループを非同期的に終了できます。

于 2014-06-23T05:06:27.130 に答える