找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4331|回复: 6

关于ACE_Reactor变更事件处理器

[复制链接]
发表于 2010-5-12 22:15:25 | 显示全部楼层 |阅读模式
有两个类:
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
大致代码如下:
  1. int RecvFile_Handle::open()
  2. {
  3.         return reactor()->register_handler(this,ACE_Event_Handler::READ_MASK);
  4. }
  5. int RecvFile_Handle::handle_input(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */)
  6. {
  7.         std::cout<<"现在由RecvFile_Handle处理消息"<<std::endl;
  8.         return 1;
  9. }
复制代码
在Client::handle_input()中
  1. case FILE_START_TYPE:
  2.                 ACE_NEW_RETURN(recvfile_handler_,RecvFile_Handle(reactor()),-1);
  3.                 if (-1==recvfile_handler_->open())
  4.                 {
  5.                         return -1;
  6.                 }
  7.                 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
请高手指教!谢谢
 楼主| 发表于 2010-5-12 22:30:51 | 显示全部楼层
少了一行
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);
发表于 2010-5-15 23:33:46 | 显示全部楼层

可以这样做

第一种方案
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也这样处理。呵呵。
这样有点别扭。卖弄技巧。

第二种方案:
不如两个事件处理器都挂接,搞个全局事件,来判断该如何操作更简单。
发表于 2010-6-15 04:00:32 | 显示全部楼层
你的问题是,handler对象没有和内在的fd绑定。
所以,解决很简单,一个handler对象+两个事物处理对象即可。
YourHandler::handle_input(...){
if (flag)
   recvfile->handle_data(...)
else
  client->handle_data(...)
第一种方案:


第二种方案:
发表于 2010-6-22 14:26:30 | 显示全部楼层
第一种可以的 为什么不行?
还有类似的:就是不一定在class Client::handle_close中再register,在Client::handle_input中remove旧的然后直接register新的。
发表于 2010-7-15 00:29:52 | 显示全部楼层
第一种可以的 为什么不行?
还有类似的:就是不一定在class Client::handle_close中再register,在Client:: ...
sokiiya 发表于 2010-6-22 14:26


    playing with handle_close 和remove永远是危险的有害的。呵呵。
发表于 2010-7-15 09:27:54 | 显示全部楼层
既然regist_handler返回了-1,那么问题就在这里了。        

return reactor()->register_handler(this,ACE_Event_Handler::READ_MASK); 这个函数会调用该类this的get_handle()函数来获取handle,应该要保证这个handle是否设置了,reactor中都是以handle的数值来注册的。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-25 02:47 , Processed in 0.023622 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表