簡體   English   中英

Libevent - 運行循環(event_base_loop)

[英]Libevent - Running the loop(event_base_loop)

請告訴我,這是 Nick Mathewson關於 Liebevent 的書的參考第 3 節(“ 運行事件循環”)的引述:

默認情況下,event_base_loop() function 會運行 event_base,直到其中沒有更多事件注冊。

老實說,我只是無法理解這句話。

什么意思 - “直到沒有更多事件注冊”。

循環如何知道沒有更多新事件? 事件之間可以有一個時間間隔 - 1 秒,1 小時......

Liebevent 如何知道事件已經結束?

PS:我正在嘗試將 event_base_loop () function 的工作與 Z0F4137ED1502B5045D6083AAt258B 上的 GetQueuedCompletionStatus () function 的工作進行比較。 因為 GetQueuedCompletionStatus 在無限循環中工作 - 無論是否有事件 - GetQueuedCompletionStatus 等待一個無限新的事件,如果沒有則不會完成。

PS1:我很着急,沒有完成“使用事件循環”一章。

它說您可以通過在第二個參數 EVLOOP_NO_EXIT_ON_EMPTY 中傳遞一個標志來重新定義 event_base_loop () function 的行為。

這將意味着 function 將無限期地等待新事件,或者直到我想通過 event_base_loopbreak / event_base_loopexit 手動退出 event_base_loop () 循環。

請注意,它說“沒有更多事件注冊”,而不是“沒有更多事件”。 默認情況下,當事件庫為空時,事件循環將退出,即使以后可能會發生更多事件。 這在本章后面都以不同的方式重述:

通常,一旦沒有掛起或活動的事件,循環就會退出。

並在event_base_loop()的 API 文檔中:

默認情況下,此循環將運行事件庫,直到沒有更多未決或活動的事件,或者直到調用 event_base_loopbreak() 或 event_base_loopexit()。

如問題中所述, EVLOOP_NO_EXIT_ON_EMPTY可以將此行為更改為更像典型的事件隊列一樣工作,等待事件(除非設置了EVLOOP_NONBLOCK )並在它們到達時調度它們。

運行事件循環”包含event_base_loop()的偽代碼,它也應該有助於澄清行為。

相比之下, GetQueuedCompletionStatus將等待並操作單個數據包。 它與帶有標志EVLOOP_ONCE | EVLOOP_NO_EXIT_ON_EMPTYevent_base_loop()最相似。 EVLOOP_ONCE | EVLOOP_NO_EXIT_ON_EMPTY ,盡管event_base_loop可能會處理多個事件,如果它們恰好在第一個事件完全處理之前進入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM