使用ID取消ACE,第1张

使用ID取消ACE,第2张

ACE的Reactor提供了两种取消定时器的方式:
虚拟int cancel _ timer(ACE _ event _ handler * event _ handler,
int dont _ call _ handle _ close = 1);
virtual int cancel _ timer(long timer _ id,
const void **arg = 0,
int dont _ call _ handle _ close = 1);
一种是用定时器ID取消定时器,定时器ID是定时器的返回值,另一种是用对应的ACE_Event_Handler指针取消定时器。一般来说,使用ACE_Event_Handler的指针取消定时器无疑是最简单的方法,但这种方法并不是一种高效的实现方式。所以如果你的程序有大规模的定时器设置取消操作,建议尽量使用ID来取消定时器。让我们用ACE_Timer_Heap和ACE_Timer_Has两个Timer_Queue来分析一下。
1 ACE_Timer_Heap如何根据Event_handler取消
先选择最常用的Time_Queue ACE_Timer_Heap。例如,使用ACE_Event_Handler关闭计时器的代码是:
template int
ACE _ timer _ heap _ t::cancel(const type & type,
int don _ call]
{
/尝试定位与timer _ id匹配的ace _ timer _ node。
//循环比较所有ace _ event _ handlers的指针是否相同
for(size)I < this-> cur _ size _;]
{
if(this-> heap _[I]--> get _ type()= = type)
{
…………template int
ace _ timer _ heap _ t::cancel(long timer _ id,
constvoid * * act,

……
/跟进操作的数组ID
else
{
ace _ timer _ node _ t * temp =
this-> remove(timer _ node _ slot);
}
}
对于ACE_Timer_Heap,使用ACE_Event_Handler指针取消定时器的平均时间复杂度应该是O(N)。由于ACE的一个Event_handler可能对应多个定时器,所以必须检查所有的定时器,以确保所有相关的定时器都被取消。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 使用ID取消ACE

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情