3

私は C++/wxWidgets を使用して小さなアプリケーションに取り組んでおり、受信した UDP データグラムなどに基づいて GUI のいくつかの部分を更新する必要があります。より具体的には、セカンダリ スレッドは、ネットワーク内で利用可能な「クライアント」のリストを保持しようとします (これは出入りする可能性があります)。たとえば、UI の対応するコンボボックスを更新して、変更を反映する必要があります。

ドキュメントには、この種のことには E​​VT_UPDATE_UI が適切な選択であることが記載されています。まばらなドキュメントから理解できる限り、このイベントはシステムによって自動的に送信され、UI の変更を支援するためのサポートを提供します。

ただし、より直接的なアプローチを使用する方が快適だと思います。たとえば、特定のイベントで通知 (イベントまたはコールバック) を受信するためにウィンドウ オブジェクトを登録/サブスクライブし、必要に応じてコードの別の部分がこれらの通知を送信する場合です。独自のコードを使用して C++ でこれを行うこともできますが、wxWidgets が既にそのようなものをサポートしている場合は、それを利用する必要があると思います。しかし、私はその点で何も見つけていません。

質問は、wxWidgets はこの種の通知システム (または同様の代替手段) をサポートしていますか? それとも、自分でコーディングするのが最善でしょうか?

4

2 に答える 2

1

私の知る限り、wxWidgets で直接使用できるものはありませんが、自分で行うのは簡単なようです。

私がすること:

  • ネットワークで利用可能な「クライアント」のリストを保持する wxEvtHandler の派生クラスを作成します。このクラスに wxCriticalSection を持たせ、「クライアント」を追加または削除するすべてのメソッドで wxCriticalSectionLocker を使用します。

  • wxThread を継承してワーカー スレッド クラスを作成し、ブロッキング呼び出しを使用して UDP データグラムを処理します。クライアントを追加または削除する必要があるときはいつでも、スレッドはクライアント リスト オブジェクトのメソッドを直接呼び出す必要があります。これらのメソッドでは、クライアントのリストを更新し、::wxPostEvent() イベントをそれ自体に更新します (これにより、メイン GUI スレッドで通知呼び出し全体が実行されます)。

  • クライアント リスト クラスでイベントを処理し、クライアントのリストが変更されたことをすべてのリスナーに通知します。オブザーバーパターンは私にはぴったりのようです。登録されているすべてのリスナーのメソッドを直接呼び出すか、wxCommandEvent を送信することができます。

于 2009-01-02T15:20:20.320 に答える
0

変更するウィジェットで Update() を呼び出してみましたか? コンボ ボックスの内容を更新したら、Update() を呼び出すと、内容が更新されます。

于 2009-04-16T23:18:40.653 に答える