peakzhang 发表于 2007-12-19 21:10:21

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

平台:WIN32.我现在要启动多个线程,每个线程里一个定时器,定时器定时去操作指定的数据.要是直接写的话没什么问题,可是现在用ACE,我首先想到的是REACTOR模式,我用的是单例模式(ACE_Reactor::instance ())可是ACE_Reactor::instance ()->schedule_timer第二次注册的时候准出错,我想可能是REACTOR模式不可以这样用,我又看了看其它的资料,有一个ACE_TIMER_QUEUE,可是资料太少了,我还在找这方面的资料,不知道各位对这个问题有什么看法,或者是好的模式推荐.

peakzhang 发表于 2007-12-19 21:19:22

出什么错误?Reactor和Proactor对定时器的支持非常好。高效方便。
ACE程序员指南,第7章第5节,第20章,都有叙述。此书本站资料栏目可以下载。

demo代码:

class MyTimerHandler : public ACE_Event_Handler
{
public:
int handle_timeout (const ACE_Time_Value &current_time,
                      const void * = 0)
{
    time_t epoch = ((timespec_t)current_time).tv_sec;
    ACE_DEBUG ((LM_INFO,
                ACE_TEXT ("handle_timeout: %s\n"),
                ACE_OS::ctime (&epoch)));
    return 0;
}
};
MyTimerHandler * timer = new MyTimerHandler ();
ACE_Time_Value initialDelay (3);
ACE_Time_Value interval (5);
ACE_Reactor::instance()->schedule_timer (timer,
                                       0,
                                       initialDelay,
                                       interval);
//schedule_timer重复使用是没问题的,返回不同的ID号码。
//另外的demo:class CTimeOutHandler :
public ACE_Event_Handler
{
public:
CTimeOutHandler(void);
~CTimeOutHandler(void);
//接口实现
virtual int handle_timeout (const ACE_Time_Value &current_time,
const void *act = 0);};
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);

peakzhang 发表于 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);

这几句解释一下?

peakzhang 发表于 2007-12-19 21:19:52

这是一个小工程里面的代码,不是写在一起的,是临时拼起来给大家demo的。

peakzhang 发表于 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);

可以运行,但是每过两天会异常退出,大家有谁碰到过类似问题嘛? 是什么原因啊?

peakzhang 发表于 2007-12-19 21:20:11

你知道ace定时器分配的timerID并不是唯一的,而是可重复的吗?缺省只能同时支持44个定时器。

你的程序运行了2天, 很有可能是因为分配定时器重复导致。

peakzhang 发表于 2007-12-19 21:20:17

的确有这个可能性!我刚刚排除了一个类似的定时器故障,也是运行2天,程序就莫明其妙的出错崩溃。查来查去,一个定时器的处理器在关闭的时候有问题,没有清除处理器对象。积累起来就出现了错误。

peakzhang 发表于 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?

peakzhang 发表于 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] \n"),nTimerID));
    }
是这样嘛?在handle_timeout(const ACE_Time_Value &current_time,const void *act )函数内,也是这样吗? 请教
页: [1]
查看完整版本: 关于多个定时器的问题???