6 1 反應器元件 ACE Reactor

2021-04-25 11:44:31 字數 2948 閱讀 5870

標籤: 

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為什麼要反應器模型 前面的文章有個共同的特點,那就是針對一對一的通訊情況,甚至雙方通訊的先後都是定式的。對於要處理多個輸入輸出 網路連線,傳統的應用都要建立新的併發單元 程序或執行緒 每個輸入輸出 網路連線乙個併發單元。這可以很好的工作,但是帶來的執行時開銷也是很大的,在一些情況下,是無法接受的。...