ACE前摄器定时器问题,欢迎指导!!!!!
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;
}
结果发现,这面的处理并不能真正取消定时器,依然会有回调,然后导致系统出错。哪位大从高手帮我分析一下。