2011-01-24 1 views
0

VB.NET 2010、.NET 4VB.NET解析シリアルデータを非同期、私はこのロジックに苦しんできた事例

こんにちは、

に共有機能からデータを取得少しの洞察を望んでいた。

私は、コンピュータに接続された多くのデバイスで構成される産業用機械を制御するためのアプリケーションに取り組んでいます。ほとんどの場合、それは正直なところでは合理的ですが、私はRS-232デバイスについて考えるのが苦労しています。 RS-232デバイスの1つは、多くの機能を備えたファンシー電源です。現在適切なのは、電圧読み出し、電圧書き込み、電流読み出し、および電流書き込みです。

私が実装しようとしているデザインパターンは、各接続されたデバイスは、この電力供給のための読書の/ etcとCOMポートのようなもののためのプロパティの書き込みなど

するためのメソッドを持つオブジェクトで表現したものです明らかにポート参照をインスタンス間で共有する必要があるため、保護された共有プロパティポートとしてのIO.Ports.SerialPortを持つ基本クラス(PowerSupplyなど)があります。次に、このクラスを継承したクラス、すなわちPowerSupplyVoltageとPowerSupplyCurrentを持っているクラスは、最後に読み書きされた値を保持するための読み書きメソッドとプロパティを定義します。

私の問題は、共有Seri​​alPortオブジェクトのPort.DataRecievedイベントを使用して、電源装置からの応答を解析することです。電源が使用するプロトコルは、各応答パケットで送信するデータを指定します。ですから、基本的に「電圧は100V」、「電流は1A」、「電圧は150Vに設定されています」などと言うこともあります。

これを共有関数で解析しようとしています。解析処理中のみ、どのインスタンスの読み書き値を更新するかを決定します。共有関数内からインスタンスの読み込み/書き込み値プロパティにアクセスすることはできません。私の脳は、これをどうやって行うのか考えようとすることに傷つきます。私が考えることができる最高のものは、PowerSupplyVoltageとPowerSupplyCurrentインスタンスへの参照を共有ポートとDataRecievedHandler関数とともに保持する何らかの種類のPowerSupplyCommunicatorオブジェクトを作成することです。しかし、これはクルージングのように思える。これについて賢明なやり方を考えていますか?

事前にどうもありがとう、 ブライアン

答えて

1

私は共有オブジェクトは、パラメータメッセージは、シリアルポート経由で来る時はいつでも上げられるイベントを、エクスポートしたお勧めします。さまざまなオブジェクト・インスタンスがイベントにサブスクライブし、適切なものとして自分自身を更新することができます。

このアプローチのわずかな違いは、共有オブジェクトがメッセージを受信したときにインスタンスが共有オブジェクト呼び出しをしたいデリゲートを提供できる「登録」メソッドを提供することです。概念的には、これはイベントと非常によく似ていますが、共有オブジェクトが着信メッセージを調べ、それが指示したインスタンスのデリゲートだけを呼び出すことができる点が異なります。

3つ目のバリエーションは、オブジェクトインスタンスがINotifyVoltageChanged、INotifyCurrentChangedなどの1つ以上のインターフェイスをサポートし、共有オブジェクトの一部のメソッドを呼び出して登録することです。

ただし、個々のオブジェクトインスタンスの1つが放棄されると、共有オブジェクトはそのオブジェクトへの参照を永久に保持する可能性があることに注意してください。アプローチ#3が使用される場合、共有オブジェクトは、通常の(「強い」)参照ではなく、オブジェクトに対するWeakReferenceを保持することができる。これにより、更新通知の処理がわずかに遅くなりますが、放棄されたオブジェクトを永遠に存続させるリスクを回避できます。確かに個々のオブジェクトインスタンスはIDisposableを実装する必要があり、Disposedのときには通知を受けないようにする必要がありますが、弱参照が使用されない限り、Disposeを実際に呼び出す必要があります。弱参照が使用されない限り、ファイナライザは役に立たないことに注意してください。

+0

洞察力に感謝します。私はあなたの提案の周りに私の頭をラップしようとします。 –

関連する問題