標籤:
reactor
ace反應器
元件2008-12-07 13:46
6.1 反應器元件 ace_reactor
反應器的基本原理是:
針對關心的某個事件寫乙個事件處理器(event_handler). 將該事件處理器登記到反應器中(同時指明關心的事件).
然後反應器會自動檢測事件的發生. 並呼叫預先登記的事件處理器中的**函式.
所以. 使用者要做的工作就是:
建立事件處理器.
在反應器上登記該處理器. 告訴反應器它對某個事件有興趣.
6.2 事件處理器
在ace中. 反應器是ace_reactor類的單件物件(因為程式中通常只需要乙個反應器).
反應器提供了登記/撤銷 事件處理器的介面.
register_handler() / remove_handler() .
這些介面要求 事件處理器必須是 ace_event_handler 型別的. 所以我們的事件處理器類必須從該類繼承.
在ace_event_handler類中定義了一些類似 "handle_***" 的**方法. 我們必須在派生類中重寫我們敢興趣的.
在反應器需要檢測某個i/o控制代碼上是否有事件時. 需要知道原始控制代碼. 這樣就需要重寫事件處理器類的get_handle()函式.
下邊是ace_event_handler 中宣告的鉤子函式:
handle_signal() 當在反應器上登記的訊號發生時. 反應器**該函式. (不懂)
handle_input() 當來自i/o裝置的輸入可用時. 反應器自動**該方法.
handle_exception() 當在反應器上登記的異常事件發生時. (不懂)
handle_timeout() 當在反應器上登記的定時器超時的時候. **該方法.
handle_output() 當在io裝置上的輸出可用時. **該方法.
6.2.1 登記事件處理器
使用 ace_reactor 類的 register_handler() 函式.
這個函式有好幾個過載形式.
該函式有個引數用來指出感興趣的事件. 它可以是下邊一些常量(定義在ace_event_handler類中):
read_mask
控制代碼上有資料可讀時
** handle_input()
write_mask
控制代碼上可寫時
** handle_output()
timer_mask ** handle_close() 不懂怎麼用...
accept_mask
有來自客戶端的新的連線請求時
** handle_input()
connect_mask
建立連線時
** handle_input()
dont_call
它用在顯式拆除事件處理器的remove_handler()函式中. 表示拆除前不呼叫 handler_close() 函式.
6.2.2 拆除事件處理器
當不在需要處理某個事件時. 需要把對應的事件處理器從反應器中拆除.
有兩種拆除事件處理器的辦法:
一種是隱式的自動拆除.
當事件處理器類中的 handle_*** 方法返回的int 小於0 時. 反應器會自動呼叫事件處理器
的handle_close()方法. 並把事件處理器拆除.
另一種是顯式拆除. 即呼叫 ace_reactor::remove_handler(). 這也會呼叫事件處理器的handle_close(). 然後拆除.
不過. 如果你不需要呼叫handle_close(). 可以給remove_handler()傳遞引數 ace_event_handler::dont_call .
具體例子在後邊會給出.
6.3 通過反應器進行事件處理
6.3.1 i/o事件多路分離
// 乙個使用反應器的例子.
// (注意這裡的例子不是71頁那個. 因為那個例子小弟麼看懂ing).
// 來自 《用反應器來實現乙個tcp的伺服器. 連線的監聽. 以及在接受的新連線的上的讀取事件. 都在反應器中進行.
///
//伺服器端
#include "ace/reactor.h"
#include "ace/event_handler.h"
#include "ace/sock_acceptor.h"
const int port_no = 19999; //伺服器監聽的埠號.
typedef ace_sock_acceptor acceptor;
class my_accept_handler;
// 乙個事件處理器類.
//處理其中維護的tcp流物件 peer_ 上發生的輸入事件.
class my_input_handler : public ace_event_handler
// 下邊的函式會被反應器使用. 來得到會發生事件的底層控制代碼.
ace_handle get_handle() const
private:
ace_sock_stream peer_;
char data[12];
};// 另乙個事件處理器類. 處理接受器收到的連線的事件
class my_accept_handler : public ace_event_handler
int open(ace_addr &addr)
// 重寫基類中的handle_input()
int handle_input(ace_handle handle)
// 要重寫基類中的get_handle() 函式. 來幫助反應器取得內部控制代碼
ace_handle get_handle() const
private:
acceptor peer_acceptor; //接受器
};int main()
中反應器體積 朝陽MBR膜反應器工作原理
朝陽mbr膜反應器工作原理 xieu4sj 朝陽mbr膜反應器工作原理 汙水處理技術有待改進 厭氧膜生物反應器的使用範圍怎樣使用汙水處理裝置處理酵母廢水 在水解酸化池內安裝彈性填料,對攪動的廢水進行水力切割,使懸浮狀態的汙泥與水充分混合。反應器的四大效能優勢 沉澱區設在反應器的頂部,廢水由反應器底部...
AutoCAD雙擊反應器練習
題名 autocad雙擊反應器練習 檔名 reactor doubleclick text.lsp vl load com vl load reactors vlr remove all setvar dblclkedit 0 setvar pickfirst 1 if not c mouserea...
ACE的反應器模型
1為什麼要反應器模型 前面的文章有個共同的特點,那就是針對一對一的通訊情況,甚至雙方通訊的先後都是定式的。對於要處理多個輸入輸出 網路連線,傳統的應用都要建立新的併發單元 程序或執行緒 每個輸入輸出 網路連線乙個併發單元。這可以很好的工作,但是帶來的執行時開銷也是很大的,在一些情況下,是無法接受的。...