Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ZeroMQ:如何在Windows上处理Ctrl-C_C++_Windows_Winapi_Zeromq - Fatal编程技术网

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

C++ ZeroMQ:如何在Windows上处理Ctrl-C,c++,windows,winapi,zeromq,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( consoleHa

我想知道如何处理从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;
        }
    }
}
#包括
#包括
#包括
布尔WINAPI控制台句柄(DWORD dwCtrlType){
//在这里做什么?
返回TRUE;
}
int main(){
SetConsoleCtrlHandler(consoleHandler,TRUE);
zmq::context\u t context(1);
套接字(上下文,zmq_代表);
socket.bind(“tcp://*:5555”);
while(true){
zmq::消息请求;
试一试{
socket.recv(&请求);
}
捕获(zmq::错误\u t&e){

std::cout通常我会创建一个标志或某种排序—一个全局bool或一个内核事件

然后你循环等待这个标志被重置-所以在你的例子中,我会创建一个简单的全局bool,然后循环它而不是while(true)

因此:

它简单但有效——尽管这不会杀死你的程序,直到zmq工作再次转到while循环检查为止。(你通常可以通过关闭socket变量来做到这一点)


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

是的,这就是所做的。可能我被“阻塞读取将发出信号”误导了注释。还有一个问题:为了防止没有消息到达我的套接字,我必须添加一个超时?如果你在循环中阻塞,最好添加一个超时。然后你至少要定期检查你的循环控件(如果你喜欢的话,还可以选择在日志中写入一条“仍在工作”的消息)。
bool g_shutdown = false;

BOOL WINAPI consoleHandler( DWORD dwCtrlType ) {
    g_shutdown = true;
    return TRUE;
}

while (!g_shutdown)
{
// do your zmq work
}