找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5957|回复: 8

关于多个定时器的问题???

[复制链接]
发表于 2007-12-19 21:10:21 | 显示全部楼层 |阅读模式
平台:WIN32.我现在要启动多个线程,每个线程里一个定时器,定时器定时去操作指定的数据.要是直接写的话没什么问题,可是现在用ACE,我首先想到的是REACTOR模式,我用的是单例模式(ACE_Reactor::instance ())可是ACE_Reactor::instance ()->schedule_timer第二次注册的时候准出错,我想可能是REACTOR模式不可以这样用,我又看了看其它的资料,有一个ACE_TIMER_QUEUE,可是资料太少了,我还在找这方面的资料,不知道各位对这个问题有什么看法,或者是好的模式推荐.
 楼主| 发表于 2007-12-19 21:19:22 | 显示全部楼层
出什么错误?Reactor和Proactor对定时器的支持非常好。高效方便。
ACE程序员指南,第7章第5节,第20章,都有叙述。此书本站资料栏目可以下载。

demo代码:
  1. class MyTimerHandler : public ACE_Event_Handler
  2. {
  3. public:
  4.   int handle_timeout (const ACE_Time_Value &current_time,
  5.                       const void * = 0)
  6.   {
  7.     time_t epoch = ((timespec_t)current_time).tv_sec;
  8.     ACE_DEBUG ((LM_INFO,
  9.                 ACE_TEXT ("handle_timeout: %s\n"),
  10.                 ACE_OS::ctime (&epoch)));
  11.     return 0;
  12.   }
  13. };
  14. MyTimerHandler * timer = new MyTimerHandler ();
  15. ACE_Time_Value initialDelay (3);
  16. ACE_Time_Value interval (5);
  17. ACE_Reactor::instance()->schedule_timer (timer,
  18.                                          0,
  19.                                          initialDelay,
  20.                                          interval);
  21. //schedule_timer重复使用是没问题的,返回不同的ID号码。
  22. //另外的demo:class CTimeOutHandler :
  23. public ACE_Event_Handler
  24. {
  25. public:
  26. CTimeOutHandler(void);
  27. ~CTimeOutHandler(void);
  28. //接口实现
  29. virtual int handle_timeout (const ACE_Time_Value &current_time,
  30.   const void *act = 0);};
  31. typedef ACE_Singleton<CTimeOutHandler, ACE_Recursive_Thread_Mutex> TIMEOUT_HANDLER;
  32. typedef ACE_Singleton<ACE_Thread_Timer_Queue_Adapter<ACE_Timer_Heap>,ACE_Recursive_Thread_Mutex> ACTIVE_TIMER;  ACTIVE_TIMER::instance()->activate();
  33. //注册定时器
  34. const ACE_Time_Value curr_tv = ACE_OS::gettimeofday();
  35. //20秒钟发生一次,测试
  36. ACE_Time_Value interval = ACE_Time_Value(20,0);
  37. long nTimer = ACTIVE_TIMER::instance()->schedule(TIMEOUT_HANDLER::instance(),0,curr_tv+ACE_Time_Value(20,0),interval);
复制代码
 楼主| 发表于 2007-12-19 21:19:33 | 显示全部楼层
typedef ACE_Singleton<CTimeOutHandler, ACE_Recursive_Thread_Mutex> TIMEOUT_HANDLER;
typedef ACE_Singleton<ACE_Thread_Timer_Queue_Adapter<ACE_Timer_Heap>,ACE_Recursive_Thread_Mutex> ACTIVE_TIMER;  ACTIVE_TIMER::instance()->activate();
//注册定时器
const ACE_Time_Value curr_tv = ACE_OS::gettimeofday();
//20秒钟发生一次,测试
ACE_Time_Value interval = ACE_Time_Value(20,0);
long nTimer = ACTIVE_TIMER::instance()->schedule(TIMEOUT_HANDLER::instance(),0,curr_tv+ACE_Time_Value(20,0),interval);

这几句解释一下?
 楼主| 发表于 2007-12-19 21:19:52 | 显示全部楼层
这是一个小工程里面的代码,不是写在一起的,是临时拼起来给大家demo的。
 楼主| 发表于 2007-12-19 21:19:57 | 显示全部楼层
如上例, 多次调用schedule;

1。ACTIVE_TIMER::instance()->schedule(TIMEOUT_HANDLER1::instance(),0,curr_tv+ACE_Time_Value(20,0),interval);

2。ACTIVE_TIMER::instance()->schedule(TIMEOUT_HANDLER2::instance(),0,curr_tv+ACE_Time_Value(20,0),interval);

3。ACTIVE_TIMER::instance()->schedule(TIMEOUT_HANDLER3::instance(),0,curr_tv+ACE_Time_Value(20,0),interval);

可以运行,但是每过两天会异常退出,大家有谁碰到过类似问题嘛? 是什么原因啊?
 楼主| 发表于 2007-12-19 21:20:11 | 显示全部楼层
你知道ace定时器分配的timerID并不是唯一的,而是可重复的吗?缺省只能同时支持44个定时器。

你的程序运行了2天, 很有可能是因为分配定时器重复导致。
 楼主| 发表于 2007-12-19 21:20:17 | 显示全部楼层
的确有这个可能性!我刚刚排除了一个类似的定时器故障,也是运行2天,程序就莫明其妙的出错崩溃。查来查去,一个定时器的处理器在关闭的时候有问题,没有清除处理器对象。积累起来就出现了错误。
 楼主| 发表于 2007-12-19 21:20:29 | 显示全部楼层
我用的是单例模式(ACE_Reactor::instance ())可是ACE_Reactor::instance ()->schedule_timer第二次注册的时候准出错.
U did something wrong.

1。ACTIVE_TIMER::instance()->schedule(TIMEOUT_HANDLER1::instance(),0,curr_tv+ACE_Time_Value(20,0),interval);

2。ACTIVE_TIMER::instance()->schedule(TIMEOUT_HANDLER2::instance(),0,curr_tv+ACE_Time_Value(20,0),interval);

3。ACTIVE_TIMER::instance()->schedule(TIMEOUT_HANDLER3::instance(),0,curr_tv+ACE_Time_Value(20,0),interval);

可以运行,但是每过两天会异常退出,大家有谁碰到过类似问题嘛? 是什么原因啊?
Most likely, the event_handler got removed somehow. looking for descon
been called or not. R u using ref count for event_hander?
 楼主| 发表于 2007-12-19 21:20:35 | 显示全部楼层
定时器的处理器在关闭的时候,怎样去清除处理器对象呢?

    ACE_Message_Block * pHead = 0;
    int nCancel = ACTIVE_TIMER::instance()->cancel(nTimerID,(const void **)&pHead);
    if(nCancel == 1)
    {
     //取消成功
     if(pHead)
     {
      //释放,防止内存泄漏
      pHead->release();
     }
    }
    else
    {
     ACE_ERROR((LM_ERROR,ACE_TEXT("%I [%D] [%M] [in file: %N on line %l] [more info: 停止timer失败 nTimerID = %d]\n"),nTimerID));
    }
是这样嘛?  在handle_timeout(const ACE_Time_Value &current_time,const void *act )函数内,也是这样吗? 请教
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-4 16:43 , Processed in 0.022932 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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