找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5421|回复: 4

请问 为什么在handle_exception 处理程序加的打印信息 出不来

[复制链接]
发表于 2010-12-28 10:12:19 | 显示全部楼层 |阅读模式
本帖最后由 maddreamw88 于 2010-12-28 10:21 编辑

请问我在handle_exception  加了 打印信息,为什么运行时,标准输入quit , 打印信息出不来?我用ACE_OS::printf, printf, std::cerr等都试过,都没打印,不知什么原因,难道是我对notify理解有误, 发送消息后,不会回调handle_exception ,请高手解答,谢谢!

源码如下: 其实就是ace源代码包 ACE_wrappers/examples/C++NPv2、Select_Reactor_Logging_Server.cpp 代码

typedef Reactor_Logging_Server<Logging_Acceptor_Ex>
        Server_Logging_Daemon;


class Quit_Handler : public ACE_Event_Handler {
public:
  Quit_Handler (ACE_Reactor *r) : ACE_Event_Handler (r) {}

  virtual int handle_exception (ACE_HANDLE) {
        ACE_OS::printf("hhhhhhhhhhhhhhhhhhhh\n");
    reactor ()->end_reactor_event_loop ();
    return -1; // Trigger call to handle_close() method.
  }

  virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask)
  {
        delete this;
        return 0;
}

protected:

  // Protected destructor ensures dynamic allocation.
  virtual ~Quit_Handler () {}
};


static ACE_THR_FUNC_RETURN event_loop (void *arg) {
  ACE_Reactor *reactor = static_cast<ACE_Reactor *> (arg);
reactor->owner (ACE_OS::thr_self ());
  reactor->run_reactor_event_loop ();
  return 0;
}


static ACE_THR_FUNC_RETURN controller (void *arg) {
  ACE_Reactor *reactor = static_cast<ACE_Reactor *> (arg);

  Quit_Handler *quit_handler = 0;
  ACE_NEW_RETURN (quit_handler, Quit_Handler (reactor), 0);

#if defined (ACE_WIN32) && (!defined (ACE_HAS_STANDARD_CPP_LIBRARY) || \
                            (ACE_HAS_STANDARD_CPP_LIBRARY == 0) || \
                            defined (ACE_USES_OLD_IOSTREAMS))
  for (;;) {
    char user_input[80];
    ACE_OS::fgets (user_input, sizeof (user_input), stdin);
    if (ACE_OS::strcmp (user_input, "quit") == 0) {
      reactor->notify (quit_handler);
      break;
    }
  }
#else
  for (;;) {
    std::string user_input;
    std::getline (cin, user_input, '\n');
    if (user_input == "quit") {
      reactor->notify (quit_handler);
      break;
    }
  }
#endif

  return 0;
}


int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
  ACE_Select_Reactor select_reactor;
  ACE_Reactor reactor (&select_reactor);

  Server_Logging_Daemon *server;
  // Ignore argv[0]...
  --argc; ++argv;
  ACE_NEW_RETURN (server,
                  Server_Logging_Daemon (argc, argv, &reactor),
                  1);
  ACE_Thread_Manager::instance ()->spawn (event_loop, &reactor);
  ACE_Thread_Manager::instance ()->spawn (controller, &reactor);
  return ACE_Thread_Manager::instance ()->wait ();
}
发表于 2010-12-28 10:14:58 | 显示全部楼层
请用ACE_DEBUG打印,因为printf被ACE重载了,我以前经常遇到这样的情况,后来发现只有当缓冲的printf达到一定的限制的时候,才会打印输出在屏幕上。
 楼主| 发表于 2010-12-28 10:34:31 | 显示全部楼层
回复 2# freeeyes

freeeyes 谢谢你的解答
    我按你的说法 我换成   ACE_DEBUG((LM_DEBUG,"(%D|%M|%N|%l) hhhhhhhhhhhhhhhhhhhh \n"));
但还是没显示,   难道是我对notify理解有误, 发送消息后,不会回调handle_exception ,不知道为什么不打印这行
发表于 2010-12-28 10:49:41 | 显示全部楼层
 楼主| 发表于 2010-12-28 13:52:20 | 显示全部楼层
回复 4# freeeyes


    哈 谢谢解答!我原来理解的没问题,是我自己应用出错,运行这个程序时 后面没带端口参数,导致线程event_loop  没停留在run_reactor_event_loop () ,而是 早就退出了,所以 线程 controller  发notify消息 ,没回调到handle_exception
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-17 04:08 , Processed in 0.017287 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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