Совместное использование свойства класса (поля) между приложениями
У меня есть 8-битная плата цифрового вывода, используемая для управления устройством. Каждому внешнему устройству требуется один бит, и оно управляется другим приложением. Я написал библиотеку классов и класс DigitalOutputPort (VB 2010), который охватывает драйвер, управляющий 8-битным портом. Каждое приложение устройства использует этот класс, создавая свой собственный экземпляр.
Чтобы установить бит цифрового порта вывода, я должен записать в этот порт байт: этот байт является битовой маской для всех 8 битов вместе: чтобы установить HIGH для номера бита 0 - 1 - 2, мне нужно записать 7 на порт, чтобы установить HIGH все 8 бит, я должен написать 256, и так далее...
Все работает нормально, когда только ОДНО приложение использует класс. Но если два приложения хотят установить свой собственный бит на этом порту, у меня возникают проблемы, потому что я не знаю текущего значения всех битов, установленных другими приложениями (драйвер не имеет такой функции), и, конечно, я не могу изменить один бит без изменения всего остального (если я не знаю текущую битовую маску)
Обычно это выглядит как типичный случай обмена данными между двумя приложениями, и моей первой идеей было записать текущее значение порта в файл на диске, где все приложения могут получить к нему доступ и прочитать его. Но это кажется слишком тяжелым для этой простой проблемы. Кроме того, это может также создать проблему производительности и надежности.
Тогда я подумал об использовании общего поля (свойства) в классе. Общее поле сохраняет свое значение для всех экземпляров класса: но верно ли это для экземпляров из разных приложений? Я не могу найти больше информации об этом последнем пункте, я должен сделать тот же тест.
Третий способ - создать только один экземпляр класса DigitalOutputPort, один для всех приложений. Первое приложение, которому это нужно, создаст объект, все остальные приложения будут использовать уже созданный объект. Мне нравится больше, чем другие, но я не знаю, если и как это можно сделать.
Какой подход должен быть правильным на ваш взгляд?
Спасибо за ответ.
1 ответ
Два разных приложения всегда будут иметь различную и отдельную память. Так что даже общее поле не будет таким же. Совместно используемое поле используется только в контексте определенного приложения и его памяти, а не глобально в системе.
Таким образом, вам нужно обмениваться данными между двумя приложениями. Есть несколько вариантов, хотя самый простой и легкий - тот, который вы упомянули - сохраните его в файле на диске. Это не излишество, так как это очень простая реализация. Просто помните, что не нужно блокировать файл, так как доступ к нему понадобится нескольким процессам.
Еще одна возможность, которую вы подняли, связана с общим экземпляром DigitalOutputPort. Это означает, что первое приложение должно создать экземпляр и предоставить его через WCF/Remoting/ каким-либо другим способом межпроцессного взаимодействия, чтобы другие приложения могли получить к нему доступ. Это, конечно, возможно (хотя состояние DigitalOutputPort будет потеряно после закрытия всех этих приложений), но это намного сложнее, особенно если вы еще не работали с этими коммуникационными средами.
Я бы использовал файл на диске или, возможно, раздел реестра, чтобы хранить общие постоянные данные между приложениями.