如何在 MFC 应用程序中启动 ZeroMQ 线程?
How to start a ZeroMQ thread in an MFC application?
(Visual Studio 2017, C++ 17, cppzmq 4.6.0(
我是MFC编程的新手。我只想在线程上创建一个 ZeroMQ 回复服务器,该服务器将始终准备好在我的 MFC 程序中接收用户请求并运行某些功能。
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 中初始化它。这样,您就可以在程序的持续时间内将线程保持在范围内(至关重要的是,您可以在程序退出时优雅地停止线程(。
相关文章:
- 如何创建一个空的全局类并在启动时实例化它
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- 使用 std::string () const 函数启动线程或未来
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- 如何创建线程序列以按照启动顺序执行任务?
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 在挂钩启动新线程时解除挂钩进程
- 程序无法启动,因为缺少 libmpc-3.dll
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- QSerialPort 在应用程序启动之前正在使用中
- 无法在 Arch Linux 中启动虚幻引擎 4
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 如何使用 ctypes 停止和重新启动从 Python 运行的C++代码
- 程序在使用 system() 启动另一个可执行文件时停止
- Qt 和 Android - 如何使用 Qandroidjniobject 启动相机
- Q没有管理权限的 exe 无法启动维护工具
- 启动类函数作为失去引用的线程
- 如何使用C++确定应用程序是否已在窗口中启动?
- 如何在 MFC 应用程序中启动 ZeroMQ 线程?