ACE前摄器定时器问题,欢迎指导!!!!!

mgphuang 2004-09-25 10:37:53
class CTG_GS_User_Handler :public ACE_Service_Handler{
public:
//构造函数
CTG_GS_User_Handler(CTG_GS_Acceptor *acc = 0)
:acceptor_(acc),mblk_(0){
}
//析构函数
~CTG_GS_User_Handler();
//由接收器接收到新的连接时,调用。
virtual void open(
ACE_HANDLE new_handle,
ACE_Message_Block & message_block
);
protected:
//接收器
CTG_GS_Acceptor *acceptor_;
//消息
ACE_Message_Block *mblk_;
//异步读取器
ACE_Asynch_Read_Stream reader_;
//异步写入器
ACE_Asynch_Write_Stream writer_;
//读回调
virtual void handle_read_stream(
const ACE_Asynch_Read_Stream::Result &result
);
//写回调
virtual void handle_write_stream(
const ACE_Asynch_Write_Stream::Result &result
);
//定时器回调
virtual void handle_time_out(
const ACE_Time_Value &tv,
const void *p
);
private:
//更新每次收包的时间
void UpdateLastTime();
//上次收到包的时间
ACE_Time_Value m_LastUpdateTime;

我想在定时器的自理回调中检测用户是不是长时间没有发包,如果是,则将该用户断开。
CTG_GS_User_Handler :: handle_time_out(
const ACE_Time_Value &tv,
const void *p
)
{
....
reader_.cancel();
writer_.cancel();
ACE_Proactor::instance()->cancel_timer(*this,1);
delete this;
}

结果发现,这面的处理并不能真正取消定时器,依然会有回调,然后导致系统出错。哪位大从高手帮我分析一下。
...全文
167 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mgphuang 2004-09-27
  • 打赏
  • 举报
回复
问题解决了,ACE前摄式的定时器是通过Time_Heap实现的,以消息形式投放到回调队列中。
谢谢各位捧场。
cpunion 2004-09-26
  • 打赏
  • 举报
回复
并非CSDN没人,而是ACE用的人还不多,另外光是定时器就有多种。前摄器我还没用过,一般用的是反应器,工作的还比较好。我手头的前摄器资料并未提到定时器。

能把你启动定时器的代码发上来看看吗?
mgphuang 2004-09-26
  • 打赏
  • 举报
回复
我顶顶顶,CSND真是没人了。
mgphuang 2004-09-25
  • 打赏
  • 举报
回复
我再顶
mgphuang 2004-09-25
  • 打赏
  • 举报
回复
我顶!!
mgphuang 2004-09-25
  • 打赏
  • 举报
回复
如果有很多的事件处理器的话,那么这个函数要处理的过程就会很长啊。不太妥当吧。
不过还是谢谢你的顶帖。
cpunion 2004-09-25
  • 打赏
  • 举报
回复
我做定时的时候没有用这个,是用定时器启动一个函数,在里面去操作。也就没有这些问题。

顶一帖,省得你又得开马甲了。
mgphuang 2004-09-25
  • 打赏
  • 举报
回复
我还顶。

24,856

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧