0
我不知道如何處理從Windows控制檯發出的Ctrl-C
。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
循環在異常處理程序中,並讓C++綁定的RAII功能在退出main()
時執行所需的清理。
是的,這就是[zguide示例](http://zguide.zeromq.org/cpp:interrupt)所做的。也許我被「封鎖閱讀會發出一個信號」的評論誤導了。還有一個問題:爲防萬一沒有消息到達我的套接字,我不得不添加一個超時? – mkluwe
如果你在循環中阻塞,總是要添加一個超時值。然後你至少要定期檢查你的循環控件(如果你喜歡這樣的話,可以選擇寫一個「仍然有效」的消息給日誌)。 – gbjbaanb