29

Boost.AsioをQt4(推奨)またはGTKメインループと統合する方法はありますか?GTKはAPIのようなpoll(2)を提供するので、技術的には可能であるはずです。Qtは独自のネットワーク層を提供しますが、私はBoost.Asio用に作成された既存のコードを使用することを好みます。追加のスレッドを使用せにそれらを統合したいと思います。

Qt4(推奨)またはGTKmmでこれを行う方法についての参考資料はありますか?

ありがとう。

編集

答えを簡単にするために、いくつかのことを明確にしたいと思います。QtとGTKmmはどちらも「selectlike」機能を提供します。

したがって、問題は、既存の「セレクター/ポーラー」をリアクターとしてBoost.Asioに統合する方法ですio_service。現在、Boost.Asioは、select、kqueue、epoll、/ dev / poll、およびiocpをreactor/proactorサービスとして使用できます。GUIフレームワークのメインループに統合したいと思います。

任意の提案と解決策(より良い)は大歓迎です。

4

4 に答える 4

17

シンプル:io_service::poll_one() GUIに属するもの を呼び出すQTスロットを作成します。そのスロットをQTのtick信号に接続します。

詳細: 幸いなことに、Boost.Asioは非常によく設計されています。基盤となる非同期内部に実行スレッドを提供する方法には、多くのオプションがあります。人々はすでにio_service::run()、多くの不利な点があるブロッキング呼び出しの使用について言及しています。

単一のスレッドからのみGUIウィジェットにアクセスできます。外部スレッドは通常、ウィジェットを変更したい場合、GUIにイベントを投稿する必要があります。これは、Asioの動作と非常によく似ています。

単純なアプローチは、1つのスレッド(またはタイマー)を実行専用にしio_service::run()、Asio完了ハンドラーにGUIシグナルを送信させることです。これ機能します。

io_service代わりに、完了ハンドラーが呼び出し元の実行スレッドでのみ呼び出されるという保証を使用できます。io_service::run()これはブロックされており、GUIがハングする可能性があるため、GUIスレッド呼び出しを行わないでください。代わりにio_service::poll()またはを使用してio_service::poll_one()ください。これにより、保留中のAsio完了ハンドラーがGUIスレッドから呼び出されます。ハンドラーはGUIスレッドで実行されているため、ウィジェットを自由に変更できます。

io_service今、あなたは定期的に実行する機会を得ることを確認する必要があります。poll_one()GUIシグナルを数回繰り返すことをお勧めします。QTにはそのトリックを行うダニ信号があると思います。もちろん、より詳細な制御のために独自のQT信号をロールすることもできます。

于 2009-12-21T18:58:19.100 に答える
2

メインループを完全に統合すること可能です。それはただの大きな苦痛です(そして、私はまだ実際に試していません).

別のスレッドで io_service::run() を実行するのがおそらく良い方法です。

于 2009-12-23T04:18:26.013 に答える