Совместное использование свойства класса (поля) между приложениями - PullRequest
0 голосов
/ 13 февраля 2012

У меня 8-битная плата цифрового вывода, используемая для управления устройством.Каждому внешнему устройству требуется один бит, и оно управляется другим приложением.Я написал библиотеку классов и класс DigitalOutputPort (VB 2010), который охватывает драйвер, который управляет 8-битным портом.Каждое приложение устройства использует этот класс, создавая свой собственный экземпляр.

Чтобы установить бит порта цифрового выхода, мне нужно записать байт в этот порт: этот байт является битовой маской для всех 8 битвместе: чтобы установить HIGH номер бита 0 - 1 - 2, мне нужно записать 7 в порт, чтобы установить HIGH все 8 бит, мне нужно записать 256 и т. д. ...

Все работаетхорошо, когда только одно приложение использует класс.Но если два приложения хотят установить свой собственный бит на этом порту, у меня возникают проблемы, потому что я не знаю текущего значения всех битов, установленных другими приложениями (драйвер не имеет такой функции), и, конечно, я не могу изменить один битбез изменения всех остальных (если я не знаю текущую битовую маску)

Обычно это выглядит как типичный случай обмена данными между двумя приложениями, и моей первой идеей было записать текущее значение порта вфайл на диске, где все приложения могут получить доступ и прочитать его.Но это кажется слишком тяжелым для этой простой проблемы.Более того, это также может создать проблему производительности и надежности.

Тогда я подумал об использовании общего поля (свойства) в классе.Совместно используемое поле сохраняет свое значение между всеми экземплярами класса: но верно ли это и для экземпляров из разных приложений?Я не могу найти больше информации об этом последнем пункте, я должен сделать тот же тест.

Третий способ - создать только ОДИН экземпляр класса DigitalOutputPort, один для всех приложений.Первое приложение, которому это нужно, создаст объект, все остальные приложения будут использовать уже созданный объект.Мне нравится больше других, но я не знаю, можно ли и как это сделать.

Какой, по вашему мнению, должен быть правильный подход?

Спасибо, что ответили.

1 Ответ

1 голос
/ 13 февраля 2012

Два разных приложения всегда будут иметь различную и отдельную память. Так что даже общее поле не будет таким же. Совместно используемое поле используется только в контексте определенного приложения и его памяти, а не глобально в системе.

Так что вам нужно обмениваться данными между двумя приложениями. Есть несколько вариантов, хотя самый простой и легкий - тот, который вы упомянули - сохраните его в файле на диске. Это не излишество, так как это очень простая реализация. Только не забывайте блокировать файл, так как доступ к нему потребуется нескольким процессам.

Другая возможность, которую вы подняли, связана с общим экземпляром DigitalOutputPort. Это означает, что первое приложение должно создать экземпляр и предоставить его через WCF / Remoting / каким-либо другим способом межпроцессного взаимодействия, чтобы другие приложения могли получить к нему доступ. Это, безусловно, возможно (хотя состояние DigitalOutputPort будет потеряно после закрытия всех этих приложений), но это намного сложнее, особенно если вы еще не работали с этими коммуникационными средами.

Я бы привязался к файлу на диске или, возможно, к разделу реестра для хранения общих постоянных данных между приложениями.

...