关于ACE_Reactor变更事件处理器
有两个类:class Client:public ACE_Event_Handler
class RecvFile_Handle:public ACE_Event_Handler
现在的情况时,但客户端收到一个消息的时候,会自动回调Client:: handle_input(ACE_HANDLE fd= ACE_INVALID_HANDLE);
但我接受到一个指定的消息,
我想暂时将Client这个事件处理器挂起,然后将RecvFile_Handle登记进反应器,都是READ_MASK
大致代码如下:
int RecvFile_Handle::open()
{
return reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);
}
int RecvFile_Handle::handle_input(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */)
{
std::cout<<"现在由RecvFile_Handle处理消息"<<std::endl;
return 1;
}
在Client::handle_input()中
case FILE_START_TYPE:
ACE_NEW_RETURN(recvfile_handler_,RecvFile_Handle(reactor()),-1);
if (-1==recvfile_handler_->open())
{
return -1;
}
reactor()->resume_handler(this);
可是为什么下一次接受进来的数据不能自动回调RecvFile_Handle::handle_input(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */)
我调试,发现return reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);返回-1;
我使用的是ACE_WFMO_Reactor
请高手指教!谢谢 少了一行
case FILE_START_TYPE:
ACE_NEW_RETURN(recvfile_handler_,RecvFile_Handle(reactor()),-1);
reactor()->suspend_handler(this);
if (-1==recvfile_handler_->open())
{
return -1;
}
reactor()->resume_handler(this);
可以这样做
第一种方案1 开始只挂接class Client:public ACE_Event_Handler
2 class Client:public ACE_Event_Handler的handle_input里处理该处理的事情后,返回 -1.
3 这时class Client:public ACE_Event_Handler的handle_close会被调用,删除自身后,就在这里挂接class RecvFile_Handle:public ACE_Event_Handler,
同理在class RecvFile_Handle:public ACE_Event_Handler也这样处理。呵呵。
这样有点别扭。卖弄技巧。
第二种方案:
不如两个事件处理器都挂接,搞个全局事件,来判断该如何操作更简单。 你的问题是,handler对象没有和内在的fd绑定。
所以,解决很简单,一个handler对象+两个事物处理对象即可。
YourHandler::handle_input(...){
if (flag)
recvfile->handle_data(...)
else
client->handle_data(...)
第一种方案:
错
第二种方案:
错 第一种可以的 为什么不行?
还有类似的:就是不一定在class Client::handle_close中再register,在Client::handle_input中remove旧的然后直接register新的。 第一种可以的 为什么不行?
还有类似的:就是不一定在class Client::handle_close中再register,在Client:: ...
sokiiya 发表于 2010-6-22 14:26 http://www.acejoy.com/bbs/images/common/back.gif
playing with handle_close 和remove永远是危险的有害的。呵呵。 既然regist_handler返回了-1,那么问题就在这里了。
return reactor()->register_handler(this,ACE_Event_Handler::READ_MASK); 这个函数会调用该类this的get_handle()函数来获取handle,应该要保证这个handle是否设置了,reactor中都是以handle的数值来注册的。
页:
[1]