Как запустить поток ZeroMQ в приложении MF C? - PullRequest
0 голосов
/ 30 мая 2020

(Visual Studio 2017, C ++ 17, cppzmq 4.6.0)

Я новичок в программировании MF C. Я просто хочу создать сервер ответов ZeroMQ в потоке, который всегда будет готов принимать запросы пользователей и запускать определенные функции в моей программе MF C.

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 на нить. Как я могу запустить его в потоке программы MF C?

1 Ответ

0 голосов
/ 30 мая 2020

Вы должны сделать std :: thread переменной-членом вашего диалогового класса и инициализировать его в onInit. Таким образом, вы сохраняете поток в области видимости на время выполнения вашей программы (и, что особенно важно, вы можете корректно остановить поток, когда ваша программа завершится).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...