1

私の現在のプロジェクトでは、イベントを優先せずに伝播するイベント システムを使用しています。私が正確に意味すること。問題は、イベントが優先度なしで呼び出されることです。つまり、リスニング クラスは、リスナー コンテナーに追加された順序で「on message」コードを起動します。

結果の分析が予測できないほど困難になる場合があります。

「適切な方法」でイベントの順序を処理する既存のソリューションを知っていますか?

4

3 に答える 3

2

イベントを優先することは、地獄へのハイウェイです。文字通りいいえ。どのオブジェクトにどの優先度が必要かを追跡する必要があります。すると、優先順位がなくなります。次に、同じ依存関係 (優先度定数クラス) を何百ものクラスにハードコーディングし、文字通りそれらをすべて結び付けたことに気付きます。そうではないかもしれませんが、落とし穴は数多くあり、ユーモラスではありません。達成したいことを確認する必要があります。プロセスの実行シーケンスを順序付けたいとします。これらのプロセスがイベントによってトリガーされるという完全に恣意的な事実を除いて、イベントとは何の関係もありません。

多くの解決策があります:

  1. 有限状態マシンを使用します。これは、最も用途が広く明確なソリューションです。
  2. 1 つの特定のイベントによってトリガーされる順序で実行する必要があるプロセスを分離し、何らかの方法でそれらをキューに入れます。たとえば、コマンド パターンを使用し、イベントによってキュー内のすべてのコマンドの実行をトリガーします。または、約束を使用することも可能です。
  3. 正しい方法のイベント チェーン: ClassA がイベント A に応答する必要があるが、ClassB が処理を終了した後にのみ応答する必要がある場合、ClassA はイベント A に応答するのではなく、ClassB からディスパッチされたイベントに応答する必要があります。すべての中で最も好ましくありませんが、時には速くする必要があります.
于 2013-03-21T18:33:28.823 に答える
1

リスナー クラスに一種の依存関係フラグを追加します。つまり、リスナー B に依存するリスナー A が呼び出され、B が最初に実行されるとします。同様に、すべてのリスナー クラスに依存条件を設定して、必要な階層を作成できます。

循環依存を追加したり、慎重に処理したりしないようにしてください。

于 2013-03-21T14:29:38.253 に答える
1

PriorityBlockingQueueイベント実装を同等にすることで、イベント ディスパッチャ スレッドが毎回最も優先度の高いイベントを消費します。

于 2013-03-21T14:29:42.513 に答える