bobos12@126.com 发表于 2010-5-12 22:15:25

关于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
请高手指教!谢谢

bobos12@126.com 发表于 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);

shenming 发表于 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也这样处理。呵呵。
这样有点别扭。卖弄技巧。

第二种方案:
不如两个事件处理器都挂接,搞个全局事件,来判断该如何操作更简单。

steven99ca 发表于 2010-6-15 04:00:32

你的问题是,handler对象没有和内在的fd绑定。
所以,解决很简单,一个handler对象+两个事物处理对象即可。
YourHandler::handle_input(...){
if (flag)
   recvfile->handle_data(...)
else
client->handle_data(...)
第一种方案:


第二种方案:

sokiiya 发表于 2010-6-22 14:26:30

第一种可以的 为什么不行?
还有类似的:就是不一定在class Client::handle_close中再register,在Client::handle_input中remove旧的然后直接register新的。

steven99ca 发表于 2010-7-15 00:29:52

第一种可以的 为什么不行?
还有类似的:就是不一定在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永远是危险的有害的。呵呵。

dwh0403 发表于 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的数值来注册的。
页: [1]
查看完整版本: 关于ACE_Reactor变更事件处理器