ACE Event Handler 事件響應入口

2021-08-15 02:12:32 字數 3340 閱讀 1487

標頭檔案「event_handler.h」

在ace reactor框架中,ace_event_handler是所有事件處理器的基類。ace_event_handler提供了一組事件處理的掛鉤方法,理解和掌握這些掛鉤方法的觸發條件和使用方法,是ace reactor程式設計裝b道路的重點。先看一下ace_event_handler提供的關鍵方法:

1:a從b那裡下了訂單,要求b每天送乙份貨物至a提供的位址。該過程類似於在ace_reactor::register_handler()上註冊乙個事件,註冊的事件型別相當於收貨位址(reactor會根據註冊的事件型別呼叫對應的掛鉤方法),register_handler的第乙個引數是ace_event_handler指標,第二個引數是註冊的事件型別,見下圖:

register_handler註冊了哪個事件,當該型別事件發生時,ace_reactor就會呼叫對應的掛鉤方法,比如read_mask對應handle_input方法。沒有註冊的事件型別是不會觸發對應方法的。ps:ace_event_handler::rwe_mask等價於read+write+except。

ace_reactor::instance()->register_handler(this,ace_event_handler::rwe_mask);
2:僅有收貨位址是不夠的,還需要指定收貨人。由於ace_event_handler是虛基類,我們需要在子類中提供收貨人實體。假設需要接收的物品為資料流,可以定義實體ace_sock_stream   m_peer。將ace_sock_stream收貨人資訊通知給某寶的方法是get_handle,使用方法如下:

ace_handle cclass::get_handle (void) const

;

3:某君a收到了貨物,試用了後覺得還不錯,b繼續送;或者通知b不要再送該類物品。

對於情況1,在ace_event_handler的handle_*()方法中返回大於等於0的int值。對於情況2,在handle_*()方法中返回-1,ace_reactor將會通知handle_close()方法進行後續處理,並清除掉步驟1中register_handler對應的mask值。handle_*()各類方法的原型函式如下:

///

called when input events occur (e.g., connection or data).

virtual

int handle_input (ace_handle fd =ace_invalid_handle);

///called when output events are possible (e.g., when flow control

///abates or non-blocking connection completes).

virtual

int handle_output (ace_handle fd =ace_invalid_handle);

///called when an exceptional events occur (e.g., sigurg).

virtual

int handle_exception (ace_handle fd =ace_invalid_handle);/**

* called when timer expires. @a current_time represents the current

* time that the event_handler was selected for timeout

* dispatching and @a act is the asynchronous completion token that

* was passed in when was invoked.

*/virtual

int handle_timeout (const ace_time_value ¤t_time,

const

void *act = 0

);

///called when a process exits.

virtual

int handle_exit (ace_process *);

///called when a handle_*() method returns -1 or when the

///remove_handler() method is called on an ace_reactor. the

///@a close_mask indicates which event has triggered the

///handle_close() method callback on a particular @a handle.

virtual

inthandle_close (ace_handle handle,

ace_reactor_mask close_mask);

///called when object is signaled by os (either via unix signals or

///when a win32 object becomes signaled).

virtual

int handle_signal (int signum, siginfo_t * = 0, ucontext_t * = 0);

ps1:handle_close()的返回值將會被忽略。

ps2:handle_close()在兩種情況下被觸發:1,handle_*()方法返回-1;2,呼叫ace_reactor::remove_handler()。

4:a從b那裡解除合約訂單,呼叫

ace_reactor::register_handler()相反的操作

ace_reactor::remove_handler()。如果不希望remove_handler會觸發handle_close()方法,可以在mask值加上dont_call標識位:

ace_reactor::instance()->remove_handler(this,ace_event_handler::rwe_mask | ace_event_handler::dont_call);

WXS響應事件

一次 touchmove 的響應需要經過2 次的邏輯層和渲染層的通訊以及一次渲染,通訊的耗時比較大。同時,setdata 渲染也會阻塞其它指令碼執行,導致了整個使用者互動的動畫過程會有延遲。wxs響應事件即為乙個非常有效的解決方案 它提出了wxs響應函式,該函式放置於檢視層 中,讓事件在檢視層響應,...

CDialog響應鍵盤事件

在網上經常有人提出cdialog中響應鍵盤訊息的onkeydown函式沒反應。結論是cdialog不響應onkeydown,相應的解決方法是 乙個簡單的辦法就是過載cwnd pretranslatemessage bool ctestdlg pretranslatemessage msg pmsg ...

MFC 鍵盤響應事件

鍵盤響應有三個函式 1 wm keydown void cmyview onkeydown uint nchar uint nrepcnt uint nflags 2 wm char void cmyview onchar uint nchar uint nrepcnt uint nflags 3 ...