|
发表于 2009-6-18 16:32:03
|
显示全部楼层
// Set the timer queue.
this->timer_queue (tq);
// Create the timer handler
ACE_NEW (this->timer_handler_,
ACE_Proactor_Timer_Handler (*this));
// Activate <timer_handler>.
if (this->timer_handler_->activate () == -1)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%N:%l:(%P | %t):%p\n"),
ACE_TEXT ("Task::activate:could not create thread\n")));
这是proactor构造函数内的代码,可以看出ACE_Proactor_Timer_Handler 是继承自ACE_Task的,
在svc方法内部仅作检查超时,检查到超时之后调用this->proactor_.timer_queue ()->expire ();
不做其他任何事情。
timer_queue 的定义为:
typedef ACE_Timer_Queue_T<ACE_Handler *,
ACE_Proactor_Handle_Timeout_Upcall,
ACE_SYNCH_RECURSIVE_MUTEX>
TIMER_QUEUE;
因此其实expire 的内部调用了ACE_Proactor_Handle_Timeout_Upcall的timeout方法
在timeout函数内部,创建了一个ACE_Asynch_Result_Impl,然后调用PostQueuedCompletionStatus
将这个事件推人完成端口。
然后任意我们被激活的工作线程,将通过GetQueuedCompletionStatus获得这个完成事件,
并在自定义的handle_time_out内部被处理。这就是全部的过程了。
工作线程即是工作线程,timer调度线程即是调度线程,两者不存在包含关系,
因此无需判断自己是否是特殊线程,其他的部分,我们的理解是一致的。 |
|