18、boost asio 教程---手动事件轮询

通常,客户端应用程序会维护对系统事件的轮询。一些平台允许你完全维护事件轮询。在Windows上,类似于PeekMessage - DispatchMessage循环。其他平台可能会限制这一点,并提供类似于iOS上的UIKit框架的更新处理程序。在这两种情况下,您可能希望合并Boost.Asio和操作系统事件的轮询。当然,您可以在额外的线程中运行io_context::run,但一般来说,这不是一个好主意,因为您将需要在这些轮询之间进行通信,这可能导致需要一堆棘手、不方便甚至不安全的代码。如果确实必须这样做,那么可以这样做。一般而言,更好的方法是在同一个线程中轮询两种类型的事件。

一个带有窗口和OpenGL图形的简单Windows应用程序的事件轮询循环可能如下所示:

application app;

for(;;)
{
    MSG message;

    while(PeekMessage(&message, window, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    app.draw();
    SwapBuffers(device_context);
}

好的。现在我们需要将Boost.Asio的事件轮询添加到这个循环中。如果将io_context::run放入此循环中,它将阻塞并且不会处理任何Windows消息。这不是我们想要的。为了手动调用Boost.Asio完成处理程序,我们将使用io_context::poll函数,而不是io_context::run。它会调用到目前为止已完成的所有任务的处理程序,并返回给调用线程:

io

猜你喜欢

转载自blog.csdn.net/Knowledgebase/article/details/133012909