18. Boost-Asio-Tutorial – manuelle Ereignisabfrage

Typischerweise führen Clientanwendungen Abfragen für Systemereignisse durch. Auf einigen Plattformen können Sie die Ereignisabfrage vollständig beibehalten. Unter Windows ähnlich der PeekMessage-DispatchMessage-Schleife. Andere Plattformen schränken dies möglicherweise ein und stellen Update-Handler bereit, die dem UIKit-Framework auf iOS ähneln. In beiden Fällen möchten Sie möglicherweise die Abfrage von Boost.Asio- und Betriebssystemereignissen kombinieren. Natürlich können Sie io_context::run in einem zusätzlichen Thread ausführen, aber im Allgemeinen ist dies keine gute Idee, da Sie zwischen diesen Umfragen kommunizieren müssen, was zu einer Menge kniffligem, unbequemen oder sogar unsicheren Code führen kann. Wenn Sie es wirklich tun müssen, dann können Sie es tun. Im Allgemeinen besteht ein besserer Ansatz darin, beide Ereignistypen im selben Thread abzufragen.

Eine Ereignisschleife für eine einfache Windows-Anwendung mit Windows- und OpenGL-Grafiken könnte wie folgt aussehen:

application app;

for(;;)
{
    MSG message;

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

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

OK Jetzt müssen wir die Ereignisabfrage von Boost.Asio zu dieser Schleife hinzufügen. Wenn Sie io_context::run in diese Schleife einfügen, wird sie blockiert und es werden keine Windows-Meldungen verarbeitet. Das ist nicht das, was wir wollen. Um den Boost.Asio-Completion-Handler manuell aufzurufen, verwenden wir die Funktion io_context::poll anstelle von io_context::run. Es ruft die Handler für alle bisher abgeschlossenen Aufgaben auf und kehrt zum aufrufenden Thread zurück:

io

Supongo que te gusta

Origin blog.csdn.net/Knowledgebase/article/details/133012909
Recomendado
Clasificación