找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4520|回复: 3

通过按ctrl+z(信号)结束Reactor事件循环的方法

[复制链接]
发表于 2008-7-15 22:08:30 | 显示全部楼层 |阅读模式
初学ACE会对事件循环的结束不知所措。
......
啥也不说了,就看代码吧。


// Create an adapter to end the event loop.
  ACE_Sig_Adapter sa ((ACE_Sig_Handler_Ex) ACE_Reactor::end_event_loop);

  ACE_Sig_Set sig_set;
  sig_set.sig_add (SIGINT);
  sig_set.sig_add (SIGQUIT);

  // Register ourselves to receive signals so we can shut down
  // gracefully.
  if (ACE_Reactor::instance ()->register_handler (sig_set,
                                                  &sa) == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                       ACE_TEXT ("%p\n"), ACE_TEXT ("register_handler")),
                      -1);

  // This makes the README demo even easier (for sighup).
  ACE_DEBUG ((LM_DEBUG,
              ACE_TEXT ("pid = %d\n"),
              ACE_OS::getpid ()));

  // Run forever, performing the configured services until we are shut
  // down by a SIGINT/SIGQUIT signal.

  // We use this version of the event loop so that reconfigurations
  // are triggered properly.
  ACE_Reactor::run_event_loop ();
 楼主| 发表于 2008-7-15 22:08:38 | 显示全部楼层
可以用另外的办法,也很简单:
//设置控制方式
// Define a function to handle Ctrl+C to cleanly shut this down.
BOOL WINAPI Service::ConsoleHandler (DWORD ctrlType)
{
ACE_UNUSED_ARG (ctrlType);
stopserver();

return TRUE;
}
int ACE_MAIN(int argc, ACE_TCHAR* argv[])
{
SetConsoleCtrlHandler (ConsoleHandler, 1);
}
 楼主| 发表于 2008-7-15 22:08:54 | 显示全部楼层
不过如果这样处理的话程序不是就无法在windows和linux上跨平台使用了吗?
 楼主| 发表于 2008-7-15 22:09:00 | 显示全部楼层
自己用宏定义分隔开。指望完全跨平台,不太现实,90%以上的代码能够跨平台,就已经非常棒了,这里主要是有不同平台的系统特性差异和性能的因素。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-4-27 13:56 , Processed in 0.011926 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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