2012-02-13 68 views
0

我有一個用於設備控制的8位數字輸出板。每個外部設備需要一個位,並由不同的應用程序控制。 我已經寫了一個類庫和包含管理8位端口的驅動程序的類DigitalOutputPort(VB 2010)。每個設備應用程序使用這個類,創建它自己的實例。在應用程序之間共享一個類屬性(字段)

爲了設置一個數字輸出端口的位,我必須向該端口寫入一個字節:該字節是所有8位一起的位掩碼:將位編號設置爲0 - 1 - 2,我必須在端口上寫入7,設置HIGH全部8位,我必須寫入256,等等......

當只有一個應用程序使用該類時,所有工作都正常。但是,如果兩個應用程序想在該端口上設置自己的位,我就會遇到問題,因爲我不知道其他應用程序設置的所有位的當前值(驅動程序沒有這種功能),當然,我不能更改一位在不改變所有其他的(如果我不知道目前的位掩碼)

通常情況下,這看起來像兩個應用,我的第一個想法之間共享數據的典型案例是寫端口的當前值在一個文件上光盤,所有應用程序都可以訪問並讀取它。但是這個簡單的問題似乎太重了。此外,它也可能導致性能和可靠性問題。

然後我儘管在類中使用共享字段(屬性)。共享字段在類的所有實例之間保留其值:但是在不同應用程序的實例之間也是如此?我無法找到關於這最後一點的更多信息,我必須進行相同的測試。

第三種方法是我只創建一個DigitalOutputPort類的一個實例,一個用於所有應用程序。 第一個需要它的應用程序,創建該對象,所有其他應用程序將使用已經創建的對象。 我比其他人更喜歡這種方式,但我不知道是否以及如何做到這一點。

你認爲哪種方法應該是正確的?

謝謝你的回覆。

回答

1

兩個不同的應用程序將始終有不同的和獨立的內存。所以即使是共享字段也不會相同。共享字段僅在特定應用程序及其內存的環境中共享,而不是在系統上全局共享。

所以你需要在兩個應用程序之間共享數據。有幾種選擇,儘管最簡單也最容易的是你提到的選項 - 將它存儲在磁盤上的文件中。這並不過分,因爲它是一個非常簡單的實現。只要記住不要鎖定文件,因爲有幾個進程需要訪問它。

您提出的另一種可能性是使用DigitalOutputPort的共享實例。這意味着讓第一個應用程序創建實例,並通過WCF/Remoting /一些其他跨進程通信方法公開它,以便其他應用程序可以訪問它。這當然是可能的(儘管一旦所有這些應用程序關閉,DigitalOutputPort的狀態將會丟失),但是它要複雜得多,特別是如果您還沒有使用這些通信框架。

我會堅持使用磁盤上的文件或註冊表項來存儲應用程序之間的共享持久數據。

+0

我「恐懼」我不得不繼續使用WCF/Remoting方式,因爲我剛剛發現應用程序使用端口時,它被驅動程序鎖定,其他應用程序無法創建第二個實例。 – gingo 2012-02-13 09:58:18

+0

去吧。 :) 如果這是必須始終可以訪問的東西,我會構建一個Windows服務來保存DigitalOutputPort並公開獲取/設置其設置的方法。 – 2012-02-13 10:07:00

+0

共享變量僅在AppDomain中共享。 (一個應用程序可以有多個AppDomain。)[This SO question](http://stackoverflow.com/questions/2206961/sharing-data-between-appdomains)對如何跨AppDomain共享數據有一些建議。 – 2012-02-13 10:23:34

相關問題