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

标签 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") .

我想做的是中断异常处理程序中的循环,并让 C++ 绑定(bind)的 RAII 功能在退出 main() 时执行所需的清理>.

最佳答案

通常我会创建一个标志或某种类型 - 全局 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 循环检查之前这不会终止您的程序。 (你通常可以通过关闭套接字变量来做到这一点)

为了更健壮(即更快终止,取决于您的情况)使用事件和 WaitforMultipleObject 调用来等待此关闭事件和您的程序正在等待的任何其他事件(即该套接字的 recv 调用)。

关于c++ - ZeroMQ:如何在 Windows 上处理 Ctrl-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22074779/

相关文章:

c++ - 使用 C++ 每秒追加到磁盘上 JSON 文件中的 JSON 数组

c++ - 'Constexpr' 与 'extern const' 对比。哪个优先?

c++ - 我如何找到任务栏的高度?

c++ - 如何在 native C++ 中获取进程名称和日期时间戳

windows - 当用户创建挂载点时如何获得通知?

wpf - 用于开发文本编辑器的 VC (win32) 或 WPF

c++ - 在vtk中翻转Y轴

c++ - 用查找表替换 math.h exp 调用

c++ - 通过接近 MAX_PATH 长度的 Windows 网络访问文件

c - Windows 指针位图未正确更新