Используя ASIO Boost, как я могу ждать события Windows? - PullRequest
3 голосов
/ 29 сентября 2011

Моя программа должна корректно завершить работу, когда событие Windows становится сигнальным.Я использую библиотеку ASIO Boost для его сокетов.У меня есть только один io_service объект.Как я могу «зарегистрировать» этот дескриптор события с помощью io_service, чтобы он вызывал обратный вызов, когда событие сигнализирует?

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Если вы ищете обработку завершения в Windows для Boost.Asio, вы можете взглянуть на примеры здесь .

Короче говоря, вам нужно обработать события win и call stop в вашей системе.

BOOL WINAPI console_ctrl_handler(DWORD ctrl_type)
{
  switch (ctrl_type)
  {
    case CTRL_C_EVENT:
    case CTRL_BREAK_EVENT:
    case CTRL_CLOSE_EVENT:
    case CTRL_SHUTDOWN_EVENT:
      console_ctrl_function();
      return TRUE;
    default:
      return FALSE;
  }
}

При этом используется объект функции:

boost::function0<void> console_ctrl_function;

, который вам нуженпривязать к процедуре выключения / остановки вашей системы.

// Set console control handler to allow server to be stopped.
console_ctrl_function = boost::bind(&your_system::shutdown, &s);
SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
0 голосов
/ 21 сентября 2012

Начиная с Boost 1.49, кажется, что можно вызвать дескриптор, когда событие становится сигнальным, см. http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/overview/windows/object_handle.html.

...