3

私は現在、中規模のソフトウェアプロジェクトをリファクタリングしているところです。これには、複数のスレッドで使用される中央のカーネルのようなクラスが含まれています。現在、このクラスは、Glib::Dispatcher複数のスレッドによって発行されるシグナルを処理するためにを使用します。glibmmリファクタリングプロセスの1つの目標は、 (新しいフレームワークとして使用されるため)完全に取り除くことであるため、をQt使用してディスパッチャ機能を「シミュレート」する方法を見つけようとしていBoostます。Boost.Signals私はすでにとを調べましBoost.Signals2たが、これらのライブラリのどちらもディスパッチャに代わるものを提供していないようです。

コーディネーターが何をすべきかを明確にするために、公式ドキュメントからの簡単な説明を次に示します。

Glib::Dispatcherはsigc::signalと同様に機能します。ただし、通常の信号とは異なり、通知はパイプを介して非同期で行われます。これは、スレッド間で通信するためのシンプルで効率的な方法であり、単一のGUIスレッドを持つスレッドモデルで特に役立ちます。

オペレーティングシステムの内部I/Oロックを除いて、ミューテックスロックは含まれていません。これは、いくつかの使用規則を意味します。

  • シグナルに接続して通知を受信できるスレッドは1つだけですが、ロックしなくても複数の送信者が許可されます。
  • GLibメインループは受信スレッドで実行する必要があります(これは通常GUIスレッドになります)。
  • Dispatcherオブジェクトは、レシーバースレッドによってインスタンス化される必要があります。
  • 余分なロックを回避したい場合は、送信側スレッドを作成する前にDispatcherオブジェクトをインスタンス化する必要があります。
  • Dispatcherオブジェクトは、レシーバースレッドによって削除される必要があります。
  • 同じレシーバースレッドによってインスタンス化されるすべてのDispatcherオブジェクトは、同じメインコンテキストを使用する必要があります。

正しい方向への指針を教えていただけますか?これは私が使用して達成できる種類の機能Boost.SignalsですかBoost.Signals2

編集:コメンターが正しく指摘したように、使用Qtすることはおそらくオプションでしょう。ただし、リファクタリングしているクラスは非常に低レベルであるため、この追加の依存関係を追加したくありません。

4

2 に答える 2

0

それを行う簡単な方法はないと思います。ブーストのフレーバーでGlibを​​削除しても、他の何よりもアーキテクチャ上の問題である問題は解決されません。Boostに置き換えても、設計上の問題は修正されません。独自の信号インターフェースをモデル化し、Glibがすでに機能しているため、そもそもGlibを​​含む各ライブラリに適応するようにしてください。問題に別の間接レベルを追加すると、その問題を修正できます。

boost :: functionを見ると、Boostが役立ちます。glibをboostに置き換えることは、実際の前進であるとは考えていません。boostはグラフィカルライブラリではなく、実装レイヤーを備えたインターフェイスをグラフィックエンジンに追加する必要があります。

于 2012-05-29T06:42:07.190 に答える
0

私は今、問題のクラスの完全な書き直しを選択しました。によって提供された方法でディスパッチャ機能を必要としないGlibことがわかりました。代わりに、実際のグラフィカルな相互作用のためにboost::signals2からのいくつかの信号と組み合わせて、通常の信号を使用するだけで十分でした。Qt

于 2012-06-05T13:31:21.380 に答える