jj601 发表于 2009-7-2 13:36:47

ace_reactor 如何彻底关闭

我用ace reactor 做服务器程序。
在启动中ACE_INET_Addr addr_to_listen(global.listenport, ACE_LOCALHOST);
   //ClientAcceptor acceptor;
    acceptor.reactor(ACE_Reactor::instance());
    //开始监听,向反应器进行登记,请求它在可以接受新连接时回调自己。
    if (acceptor.open(addr_to_listen) == -1)
      return ;
    //进入反应器事件循环
    ACE_Reactor::instance()->run_reactor_event_loop();
开启监听。分两个类处理,ClientAcceptor,对接受事件向反应器登记,并分发
                        ClientService, 处理连接,接收客户端数据,分发到send 线程做数据处理。
关闭: Quit_Handler *quit_handler_;
    ACE_Reactor *r = ACE_Reactor::instance();
    quit_handler_ = new Quit_Handler (r);
   r->notify (quit_handler_);
   ACE_Reactor::instance()->remove_handler(acceptor.get_handle(),ACE_Event_Handler::ACCEPT_MASK);
这样之后,每次都关不掉。
提示:0x004ba33d 处未处理的异常: 0xC0000005: 读取位置 0xfeeeffb6 时发生访问冲突。程序位置为ClientAcceptor 析构函数处。
为什么会这样呢

wishel 发表于 2009-7-2 15:10:22

用notification机制关闭reactor,好像书上有例子
析构函数出问题,是不是调用了2次delete之类的?多贴些代码看看

modern 发表于 2009-7-2 15:35:57

多贴点代码出来吧,
比如类Quit_Handler 的handle_exception里面做了什么事情?
在哪里做的delete等等
还有就是把异常时候的堆栈信息也能便于定位问题
页: [1]
查看完整版本: ace_reactor 如何彻底关闭