Frage

Gibt es eine Möglichkeit Boost.Asio mit Qt4 (bevorzugt) oder GTK Hauptschleife zu integrieren? GTK bietet Umfrage (2) wie API ist so technisch möglich sein sollte. Qt stellt eine eigene Netzwerkschicht, aber ich bevorzuge für Boost.Asio geschrieben bestehenden Code zu verwenden. Ich mag, dass sie ohne mit einem zusätzlichen Thread integrieren.

Gibt es eine Referenz, wie dies für Qt4 tun (bevorzugt) oder GTKmm?

Danke.

Bearbeiten

Ich möchte einige Dinge clearify die Antwort zu erleichtern. Sowohl Qt und GTKmm bieten "Wählen wie" Funktionalität:

So ist die Frage, wie bestehende „Selektoren / Poller“ als Reaktor integrieren Boost.Asio io_service. Heute können Boost.Asio verwenden wählen, kqueue, epoll, / dev / poll und iocp als Reaktor / proactor Service. Ich will es in der Hauptschleife von GUI-Framework integrieren.

Alle Vorschläge und Lösungen (besser) sind willkommen.

Andere Tipps

Ganz einfach: Bauen Sie ein QT-Steckplatz, der die io_service::poll_one() zum gui gehören, nennt. Schließen Sie diesen Schlitz zu QT des tick Signal.

In Tiefe: Zum Glück für Sie Boost.Asio ist sehr gut gestaltet. Es gibt viele Möglichkeiten, wie man einen Thread der Ausführung auf die zugrunde liegenden asynchronen Einbauten zur Verfügung zu stellen. Die Menschen haben bereits erwähnt mit io_service::run(), einen blockierenden Aufruf mit vielen Nachteilen behaftet.

Sie sind nur GUI-Widgets aus einem einzigen Thread zugreifen dürfen. Außengewinde müssen in der Regel Ereignisse an die gui veröffentlichen, wenn sie irgendeine Widget mutieren tun wollen. Dies ist sehr ähnlich wie Asio funktioniert.

Der naive Ansatz ist es, nur einen Thread zu widmen (oder Zeitgeber) zu laufen und haben die io_service::run() Asio Abschluss-Handler ein GUI-Signal senden. Diese wird Arbeit.

Sie können stattdessen die Garantie verwenden, die Fertigstellung Handler wird nur in dem Thread der Ausführung des io_service Anrufer aufgerufen werden. hat die GUI-Thread Anruf io_service::run() nicht, wie es blockiert und konnte den gui hängen. Verwenden Sie stattdessen io_service::poll() oder io_service::poll_one(). Dies bewirkt, dass alle ausstehenden Asio Abschluss-Handler von dem GUI-Thread aufgerufen werden. Da die Handler in dem GUI-Thread laufen sie frei sind, um die Widgets zu ändern.

Jetzt müssen Sie sicherstellen, dass der io_service eine Chance, regelmäßig zu laufen bekommt. Ich empfehle, mit einem sich wiederholenden gui Rufsignal ein paar Mal poll_one(). Ich glaube, QT ein Tick-Signal hat, die den Trick tun würde. Sie könnten Ihr eigenes QT-Signal für mehr Kontrolle natürlich rollen.

Wenn ich verstehe Ihre Frage richtig, müssen Sie Code für Boost.Asio geschrieben. Sie mögen, dass Code in einer GUI-Anwendung verwenden.

Was ist nicht klar, in Ihrer Frage ist, wenn Sie die Qt / Gtk Netzschichten durch asynio für Ihren Code zur Arbeit wickeln möchten, wenn Sie nur für eine Lösung suchen, sowohl eine gui Ereignisschleife für und mit asynio zusammen.

Ich werde den zweiten Fall übernehmen.

Sowohl Qt und GTK haben Methoden ausländische Ereignisse in ihrem Ereignisschleife zu integrieren. Siehe zum Beispiel qtgtk wo die Qt-Ereignisschleife in Gtk angeschlossen ist.

Im speziellen Fall von Qt, wenn Sie möchten, Ereignisse für Qt generieren, können Sie die folgende Klasse verwenden: QAbstractEventDispatcher .

Nach einem kurzen Blick auf Boost Asio, ich glaube, Sie folgende tun müssen:

  • hat eine wiederkehrende QTimer mit der Dauer Null, die io_service ruft :: run () die ganze Zeit. Auf diese Weise boost :: asio wird Ihren Abschluss-Handler, sobald Ihre asynchrone Operation abgeschlossen ist aufrufen.
  • in Ihrem Abschluss-Handler, zwei Möglichkeiten:
    • , wenn Ihr Abschluss Betrieb lang ist, von der GUI getrennt, Ihr Unternehmen tun und stellen Sie sicher, qApp.processEvents () aufzurufen, regelmäßig die GUI ansprechbar
    • zu halten
    • , wenn Sie nur wollen, mit der GUI kommunizieren zurück:
      1. definieren eine benutzerdefinierte QEvent Typ
      2. zu diesem Ereignis abonnieren
      3. Geben Sie Ihre Veranstaltung Qt Ereignisschleife mit QCoreApplication :: postevent ( ).

Genuinely die Hauptschleifen Integration ist möglich. Es ist nur ein großer Schmerz (und ich habe noch tatsächlich, es zu versuchen).

Beim Laufen io_service :: run () auf einem separaten Thread wahrscheinlich der Weg zu gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top