void ACE_QtReactor::exception_event (int p_handle) { ACE_TRACE ("ACE_QtReactor::exception_event"); ACE_HANDLE handle = ACE_HANDLE( p_handle ); #ifdef ACE_QTREACTOR_CLEAR_PENDING_EVENTS // disable socket notifier to clear pending events QSocketNotifier *qsock_notifier = 0; if ( ( this->exception_notifier_.find( handle, qsock_notifier) != -1) ) qsock_notifier->setEnabled( false ); #endif /* ACE_QTREACTOR_CLEAR_PENDING_EVENTS */ // The core of exception event handling ACE_Select_Reactor_Handle_Set dispatch_set; dispatch_set.ex_mask_.set_bit( handle ); dispatch (1, dispatch_set); #ifdef ACE_QTREACTOR_CLEAR_PENDING_EVENTS // enable socket notifier according to current mask ACE_Reactor_Mask mask = 0; mask = mask_ops( handle, mask, ACE_Reactor::GET_MASK ); if ( -1 != mask ) set_enable_flag_by_mask ( 1, handle, mask); #endif /* ACE_QTREACTOR_CLEAR_PENDING_EVENTS */ }
/* 另一种从反应器的内部表中拆除事件处理器的方法是显式地调用反应器的remove_handler()方法集。 在remove_handler()被调用时,反应器还自动调用事件处理器的handle_close()方法。 可以这样来对其进行控制:将ACE_Event_Handler::DONT_CALL掩码传给remove_handler(),从而使得handle_close()方法不会被调用。 */ int main(int argc, char *argv[]) { //instantiate the handler MyEventHandler * eh = new MyEventHandler; //Register the handler asking to call back when either SIGWINCH //or SIGINT signals occur. Note that in both the cases we asked the //Reactor to callback the same Event_Handler i.e., MyEventHandler. //This is the reason why we had to write a switch statement in the //handle_signal() method above. Also note that the ACE_Reactor is //being used as a Singleton object (Singleton pattern) ACE_Reactor::instance()->register_handler(SIGWINCH, eh); ACE_Reactor::instance()->register_handler(SIGINT, eh); /*注册文件描述描0(标准输入)上面的事件*/ ACE_Reactor::instance()->register_handler(ACE_HANDLE(0), eh,ACE_Event_Handler::READ_MASK); /*注册时间事件,时间为相对时间。2表示第一次触发事件在2秒后,之后的触周期为5秒*/ ACE_Reactor::instance()->schedule_timer(eh,(void *)666,ACE_Time_Value(2),ACE_Time_Value(5)); while (1) //Start the reactors event loop ACE_Reactor::instance()->handle_events(); }
long ACE_FoxReactor::onFileEvents(FXObject* /* ob */, FXSelector se, void* handle){ FXSelector sel=FXSELTYPE(se); ACE_Select_Reactor_Handle_Set dispatch_set; bool f=false; if(sel==SEL_IO_READ){ dispatch_set.rd_mask_.set_bit(ACE_HANDLE(reinterpret_cast<FXival>(handle))); f=true; } else if(sel==SEL_IO_WRITE){ dispatch_set.wr_mask_.set_bit(ACE_HANDLE(reinterpret_cast<FXival>(handle))); f=true; } else if(sel==SEL_IO_EXCEPT){ dispatch_set.ex_mask_.set_bit(ACE_HANDLE(reinterpret_cast<FXival>(handle))); f=true; }; if(f) dispatch (1, dispatch_set); return 1; }