<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #Advanced event loops libuv提供了非常多的控制event-loop的方法,你能通過使用多loop來實現很多有趣的功能。你還可以將libuv的event loop嵌入到其它基于event-loop的庫中。比如,想象著一個基于Qt的UI,然后Qt的event-loop是由libuv驅動的,做著加強級的系統任務。 ##Stopping an event loop `uv_stop()`用來終止event loop。loop會停止的最早時間點是在下次循環的時候,或者稍晚些的時候。這也就意味著在本次循環中已經準備被處理的事件,依然會被處理,`uv_stop`不會起到作用。當`uv_stop`被調用,在當前的循環中,loop不會被IO操作阻塞。上面這些說得有點玄乎,還是讓我們看下`uv_run()`的代碼: ####src/unix/core.c - uv_run ```c int uv_run(uv_loop_t* loop, uv_run_mode mode) { int timeout; int r; int ran_pending; r = uv__loop_alive(loop); if (!r) uv__update_time(loop); while (r != 0 && loop->stop_flag == 0) { uv__update_time(loop); uv__run_timers(loop); ran_pending = uv__run_pending(loop); uv__run_idle(loop); uv__run_prepare(loop); timeout = 0; if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT) timeout = uv_backend_timeout(loop); uv__io_poll(loop, timeout); ``` `stop_flag`由`uv_stop`設置。現在所有的libuv回調函數都是在一次loop循環中被調用的,因此調用`uv_stop`并不能中止本次循環。首先,libuv會更新定時器,然后運行接下來的定時器,空轉和準備回調,調用任何準備好的IO回調函數。如果你在它們之間的任何一個時間里,調用`uv_stop()`,`stop_flag`會被設置為1。這會導致`uv_backend_timeout()`返回0,這也就是為什么loop不會阻塞在I/O上。從另外的角度來說,你在任何一個檢查handler中調用`uv_stop`,此時I/O已經完成,所以也沒有影響。 在已經得到結果,或是發生錯誤的時候,`uv_stop()`可以用來關閉一個loop,而且不需要保證handler停止的順序。 下面是一個簡單的例子,它演示了loop的停止,以及當前的循環依舊在執行。 ####uvstop/main.c ```c #include <stdio.h> #include <uv.h> int64_t counter = 0; void idle_cb(uv_idle_t *handle) { printf("Idle callback\n"); counter++; if (counter >= 5) { uv_stop(uv_default_loop()); printf("uv_stop() called\n"); } } void prep_cb(uv_prepare_t *handle) { printf("Prep callback\n"); } int main() { uv_idle_t idler; uv_prepare_t prep; uv_idle_init(uv_default_loop(), &idler); uv_idle_start(&idler, idle_cb); uv_prepare_init(uv_default_loop(), &prep); uv_prepare_start(&prep, prep_cb); uv_run(uv_default_loop(), UV_RUN_DEFAULT); return 0; } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看