0

デバイス制御に使用される 8 ビットのデジタル出力ボードがあります。各外部デバイスは 1 ビットを必要とし、異なるアプリケーションによって制御されます。クラス ライブラリと、8 ビット ポートを管理するドライバーをエンベロープするクラス DigitalOutputPort (VB 2010) を作成しました。各デバイス アプリケーションはこのクラスを使用して、独自のインスタンスを作成します。

デジタル出力ポートのビットを設定するには、そのポートにバイトを書き込む必要があります。このバイトは、8 ビットすべてをまとめたビット マスクです。ビット番号 0 - 1 - 2 を HIGH に設定するには、次のように書き込む必要があります。ポートで 7、8 ビットすべてを HIGH に設定するには、256 を書き込む必要があります...

1 つのアプリケーションのみがクラスを使用する場合、すべて正常に動作します。しかし、2 つのアプリケーションがそのポートに独自のビットを設定したい場合、問題が発生します。他のアプリケーションによって設定されたすべてのビットの現在の値がわからないためです (ドライバーにはそのような機能はありません)。もちろん、1 つのビットを変更することもできません。他のすべてを変更せずに(現在のビットマスクがわからない場合)

通常、これは 2 つのアプリケーション間でデータを共有する典型的なケースのように見えます。私の最初のアイデアは、ポートの現在の値を、すべてのアプリケーションがアクセスして読み取ることができるディスク上のファイルに書き込むことでした。しかし、この単純な問題には重すぎるようです。さらに、パフォーマンスと信頼性の問題も発生する可能性があります。

次に、クラスで共有フィールド (プロパティ) を使用することについて考えました。共有フィールドは、クラスのすべてのインスタンス間でその値を保持しますが、異なるアプリケーションのインスタンス間でも同じですか? この最後の点に関する詳細情報が見つかりません。同じテストを行う必要があります。

3 番目の方法は、クラス DigitalOutputPort のインスタンスを 1 つだけ作成し、すべてのアプリケーションに対して 1 つだけ作成することです。それを必要とする最初のアプリケーションがオブジェクトを作成すると、他のすべてのアプリケーションはすでに作成されたオブジェクトを使用します。私はこの方法が他の方法よりも好きですが、それができるかどうか、またどのようにできるかはわかりません。

あなたの意見では、どちらが正しいアプローチであるべきですか?

返信ありがとうございます。

4

1 に答える 1

1

2 つの異なるアプリケーションは、常に別個の別個のメモリを持ちます。そのため、Shared フィールドでさえ同じではありません。Shared フィールドは、システム上でグローバルにではなく、特定のアプリケーションとそのメモリのコンテキストでのみ共有されます。

したがって、2 つのアプリケーション間でデータを共有する必要があります。いくつかのオプションがありますが、最も簡単で簡単なのは、あなたが言及したものです-ディスク上のファイルに保存します。これは非常に単純な実装であるため、やり過ぎではありません。いくつかのプロセスがファイルにアクセスする必要があるため、ファイルをロックしたままにしないでください。

あなたが提起した別の可能性は、DigitalOutputPort の共有インスタンスを使用することです。これは、最初のアプリケーションでインスタンスを作成し、WCF/Remoting/その他のクロスプロセス通信方法を介して公開して、他のアプリがアクセスできるようにすることを意味します。確かに可能ですが (ただし、これらのアプリをすべて閉じると DigitalOutputPort の状態は失われます)、特にこれらの通信フレームワークをまだ使用していない場合は、はるかに複雑になります。

私なら、アプリケーション間で永続的な共有データを保存するために、ディスク上のファイルか、おそらくレジストリ キーに固執します。

于 2012-02-13T09:16:53.783 に答える