找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6927|回复: 3

ACE_Handler 中的 handle_time_out() 问题

[复制链接]
发表于 2009-4-21 15:37:31 | 显示全部楼层 |阅读模式
想问一下:
handle_time_out 是当定时器到期时调用,
如果当第一次定时器到期时调用了 handle_time_out,
而执行 handle_time_out 的时间长于设置的定时回调的时间,
那么会不会同时出现两次调用 handle_time_out  呢?
还是当这次handle_time_out调用完后,紧接着再次调用 handle_time_out 呢?
还是说, 当这次 handle_time_out 完成后,再计时,时间到了再调用 handle_time_out 呢?
所有的handle_time_out 回调是否在同一个线程中完成的呢?

谢谢~~
发表于 2009-4-22 12:47:49 | 显示全部楼层
我刚好做过类似的测试,看是否对你会有帮助。
不过我做测试使用的Reactor框架内置的定时器。
启动单个线程运行Reactor,下面是我测试的结果。

handle_time_out如果执行时间超过预定的下一次超时的话,
那么下一次定时器的会等到本次执行完毕,立刻执行。
如果持续执行超时的话会一直顺延下去。
如果后来handle_time_out执行时间缩短,补偿完之前没有执行的部分之后,
定时器会按原来预定的时间间隔正常运作。

Poractor主要看你是否多线程启动Poractor了,还有就是得具体去分析代码。
分析不同框架的定时器执行原理,得出的结果才会可靠。
 楼主| 发表于 2009-4-23 11:03:01 | 显示全部楼层

回复 #2 modern 的帖子

十分感谢~~~
我自己也试了一下,也是这样的~~
多线程的还没有试过~~
发表于 2009-6-26 14:29:20 | 显示全部楼层
example中有个test_multiple_loops.cpp,很方便测各种情况。
测试结果如modern所说:
handle_time_out如果执行时间超过预定的下一次超时的话,
那么下一次定时器的会等到本次执行完毕,立刻执行。
如果持续执行超时的话会一直顺延下去。

另外补充下,如果在ACE_Reactor::run_event_loop()中加了定时设置,单线程时如果发生以上情况,将不能按时终止循环。
看了下源码,是先检测有无未处理事件再去判断定时时间是否到的。因为处理过慢,一直会有未处理的timer事件在timer queue里,因此永远不会触发定时结束,除非处理速度加快,赶了上来。

在多线程情况下,结果比较有趣:只留下一个线程来处理堆积的timer queue,其它线程都会到时退出。至于为什么会堆积到一个线程里,我猜测可能是ACE要保持timer event处理的序列性吧(在timer event发生后,如果发现前一个event尚未处理完,就把这个event也dispatch给同一个线程处理)。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 17:34 , Processed in 0.019478 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表