0

私は C++/CLI 開発の学習者ですが、最近、イベント ハンドラーに関する問題に遭遇しました。

質問は: System::Windows::Form を継承した winForm クラスにカスタム イベントを追加したいのですが、イベントはネイティブ コレクション (std::deque など) を検査する必要があります。キューのサイズが変更されるたびに、イベントは何らかの処理を行います。

私はすでにMSDNで解決策を見つけようとしましたが、見つけることができるのは、私が必要としないカスタムマネージドrefクラスだけです。

4

1 に答える 1

0

あなたの質問から、あなたのネイティブ コレクションはネイティブ コード (ネイティブ c++ のみを使用するライブラリ、名前空間など) のどこかにあると思います。 .net コレクションの 1 つを使用しないのはなぜですか?

私の仮定が正しく、コレクションがネイティブ コードにある場合、この通信を直接行う方法がわかりません。私はしばらく C++/CLI でプログラミングしていますが、.Net コードが反応するネイティブ コードで「イベント」を作成する方法がわかりませんでした。

しかし、ほぼイベントとして機能するオブザーバーパターンまたは類似のものを使用することをお勧めします。observerプロジェクト全体でネイティブ コードと .Net コードを混在させないために、.Net コードを取り込まずにネイティブ コード ( your ) で使用できる特別なオブザーバー クラス ( your ) を作成することをお勧めしsubjectます。また、.Net コード (あなたのwinForm) を認識し、両方の間の通信を行います。このオブザーバーは、コレクションのサイズが変更されたときにネイティブ コードのサブジェクトから通知を受け、winForm.

対話ネイティブ c++ <-> c++/CLI に関する追加情報 (以下のコメントを参照):

.Net 参照をネイティブ コードに格納するのは簡単なことではないため、追加のオブザーバー クラスを使用して相互作用をカプセル化することをお勧めします。winformあなたの場合、これはオブザーバークラスとして直接実装しようとしないことを意味します。サブジェクト クラスとの間に追加のネイティブ オブザーバー クラスを使用するとwinForm、オブザーバーを簡単に登録でき、このクラスにのみマネージド参照を格納するという問題が発生します。次の 2 つのオプションがあります。

  1. フォームの生きているインスタンスへの参照を取得するためのシングルトン パターンを実装します。winForm参照は、通常どおり一時的に保存できますType^。これを使用して、通知メソッドで参照を取得できます。

  2. ネイティブ オブザーバー クラスを実装し、gcrootを使用して参照を最初から格納します。この場合、いくつかのキャストを行う必要があるかもしれません。

どちらの場合も、notify メソッドで、winForm必要な処理をコレクションに対して実行する の public メソッドを呼び出します。また、.Net Framework への参照は、このオブザーバー クラスを含むプロジェクト用にセットアップする必要があります (すべてのクラスが と同じプロジェクトにある場合は、既に完了している必要がありますwinForm)。

于 2013-09-09T08:10:45.387 に答える