关于多个定时器的问题???
平台:WIN32.我现在要启动多个线程,每个线程里一个定时器,定时器定时去操作指定的数据.要是直接写的话没什么问题,可是现在用ACE,我首先想到的是REACTOR模式,我用的是单例模式(ACE_Reactor::instance ())可是ACE_Reactor::instance ()->schedule_timer第二次注册的时候准出错,我想可能是REACTOR模式不可以这样用,我又看了看其它的资料,有一个ACE_TIMER_QUEUE,可是资料太少了,我还在找这方面的资料,不知道各位对这个问题有什么看法,或者是好的模式推荐. 出什么错误?Reactor和Proactor对定时器的支持非常好。高效方便。ACE程序员指南,第7章第5节,第20章,都有叙述。此书本站资料栏目可以下载。
demo代码:
class MyTimerHandler : public ACE_Event_Handler
{
public:
int handle_timeout (const ACE_Time_Value ¤t_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 ¤t_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); 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);
这几句解释一下? 这是一个小工程里面的代码,不是写在一起的,是临时拼起来给大家demo的。 如上例, 多次调用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);
可以运行,但是每过两天会异常退出,大家有谁碰到过类似问题嘛? 是什么原因啊? 你知道ace定时器分配的timerID并不是唯一的,而是可重复的吗?缺省只能同时支持44个定时器。
你的程序运行了2天, 很有可能是因为分配定时器重复导致。 的确有这个可能性!我刚刚排除了一个类似的定时器故障,也是运行2天,程序就莫明其妙的出错崩溃。查来查去,一个定时器的处理器在关闭的时候有问题,没有清除处理器对象。积累起来就出现了错误。 我用的是单例模式(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? 定时器的处理器在关闭的时候,怎样去清除处理器对象呢?
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 ¤t_time,const void *act )函数内,也是这样吗? 请教
页:
[1]