ZeroMQ:如何在Windows上处理Ctrl-C

时间:2014-02-27 16:41:12

标签: c++ windows winapi zeromq

我想知道如何处理从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功能执行所需的清理。

1 个答案:

答案 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调用)。