我想知道如何处理从Windows控制台发出的Ctrl-C
。
#include <iostream>
#include <zmq.hpp>
#include <windows.h>
BOOL WINAPI consoleHandler( DWORD dwCtrlType ) {
// what to do here?
return TRUE;
}
int main() {
SetConsoleCtrlHandler( consoleHandler, TRUE );
zmq::context_t context( 1 );
zmq::socket_t socket( context, ZMQ_REP );
socket.bind( "tcp://*:5555" );
while ( true ) {
zmq::message_t request;
try {
socket.recv( &request );
}
catch(zmq::error_t& e) {
std::cout << "zmq error" << std::endl;
}
}
}
这将安装一个处理程序函数,该函数可以对来自控制台的CTRL_C_EVENT
起作用。目前,它什么都不做。因此,revc
调用不会导致抛出异常as described here (in "Error handling")。
我想要做的是break
异常处理程序中的循环,并让退出main()
时C ++绑定的RAII功能执行所需的清理。
答案 0 :(得分:1)
通常我会创建一个标志或某种类型 - 全局bool或内核事件。
然后你循环等待这个标志重置 - 所以在你的情况下,我会创建一个简单的全局bool然后循环它而不是while(true)。
这样:
bool g_shutdown = false;
BOOL WINAPI consoleHandler( DWORD dwCtrlType ) {
g_shutdown = true;
return TRUE;
}
while (!g_shutdown)
{
// do your zmq work
}
它简单但有效 - 虽然这不会杀死你的程序,直到zmq工作再次循环到while循环检查。 (通常可以通过关闭套接字变量来实现)
为了更强大(即更快地杀死,取决于你的情况)使用Event和WaitforMultipleObject调用来等待这个关闭事件和你的程序正在等待的任何其他东西(即socket的recv调用)。