c++ - 如何在 MFC 应用程序中启动 ZeroMQ 线程?
问题描述
(Visual Studio 2017、C++ 17、cppzmq 4.6.0)
我是 MFC 编程的新手。我只是想在我的 MFC 程序中在一个线程上创建一个 ZeroMQ 回复服务器,该线程将始终准备好接收用户请求并运行某些功能。
void zmq_server() {
zmq::context_t context{ 1 };
zmq::socket_t socket{ context, zmq::socket_type::rep };
socket.bind("tcp://*:5555");
const std::string data{ "Hi" };
while (1) {
zmq::message_t request;
socket.recv(request, zmq::recv_flags::none);
//std::cout << "Received " << request.to_string() << std::endl;
socket.send(zmq::buffer(data), zmq::send_flags::none);
}
}
我想如果我把它放在初始化对话的地方,我可以把它作为一个线程运行:
BOOL CMFCApplication2Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// TODO
// thread t1(zmq_server ) <============== PROGRAM DOESN'T RUN WITH THIS LINE
return TRUE;
}
但是对话甚至没有开始,我想知道是不是因为它不是在线程上运行 ZMQ 服务器的正确方法。如何在 MFC 程序的线程上运行它?
解决方案
您应该使 std::thread 成为对话框类的成员变量并在 onInit 中对其进行初始化。这样,您可以在程序运行期间将线程保持在范围内(至关重要的是,您可以在程序退出时优雅地停止线程)。
推荐阅读
- c - 字符无法正确比较
- java - 将用户输入字符串转换为类名
- asp.net - 我从 Listview 中获取复选框值一无所获
- .net - CosmsDB 查询日期字段
- ios - 我可以创建一个只能访问特定 IP 的 IOS 应用程序吗?
- python - 按任意间隔对时间索引的 DataFrame 进行分组
- windows-10 - 在 Windows 10 IoT Core 中禁用自动隐藏滚动条
- restfb - RestFB - 如何从收到的用户访问令牌中验证应用程序 ID
- reactjs - undefined 不是对象(评估'_this2.props.navigation')或与其他导航相比结果不一致
- asp.net - PageAsyncTask 与仅调用 await