ZeroMQ:如何在Windows上处理Ctrl-C
ZeroMQ: How to handle Ctrl-C on Windows
我想知道如何处理从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
调用不会失败引发异常,如此处所述(在"错误处理"中)。
我想做的是在异常处理程序中break
循环,并让C++绑定的 RAII 功能在退出main()
时执行所需的清理。
通常我创建一个标志或某种排序 - 全局布尔值或内核事件。
然后你循环等待这个标志被重置 - 所以在你的例子中,我会创建一个简单的全局布尔值,然后循环它而不是 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 调用来等待此关闭事件和程序正在等待的任何其他事件(即套接字的 recv 调用)。
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- C++CTRL+C处理程序有未定义的行为
- Qt 键按事件处理程序仅在按下 ctrl、alt 或 shift 键时做出反应
- 我的控制台处理程序不处理 CTRL+C,即使设置正确
- ZeroMQ:如何在Windows上处理Ctrl-C
- "Ctrl + F6"的默认处理在自定义 MDI 应用程序中不起作用
- 在Win32上处理CTRL+C
- Qt eventFilter的CTRL+TAB快捷方式被进一步处理,即使返回true
- 库覆盖信号处理程序,但我需要在CTRL+C上清理
- 如何在命令行界面中处理ctrl中断信号