【问题标题】:How to start a ZeroMQ thread in an MFC application?如何在 MFC 应用程序中启动 ZeroMQ 线程?
【发布时间】:2020-05-30 00:52:09
【问题描述】:

(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 的析构函数会抛出异常,以防它仍然占用线程资源。
  • 更正,抱歉,std::threaddestructor 调用std::terminate(),以防std::thread 对象仍与线程关联。

标签: c++ multithreading mfc zeromq


【解决方案1】:

您应该将 std::thread 作为对话框类的成员变量并在 onInit 中对其进行初始化。这样,您可以在程序运行期间将线程保持在范围内(至关重要的是,您可以在程序退出时优雅地停止线程)。

【讨论】:

  • 您不能优雅地停止std::thread。安全终止线程总是相当于实现取消支持的线程函数。 std::jthread 为此提供了一个框架。 std::thread 这完全取决于你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2023-03-12
  • 2019-03-21
  • 2013-12-13
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多