Совместное использование общей области памяти в Delphi между ПК - PullRequest
2 голосов
/ 01 октября 2010

У меня есть приложение Delphi 2006, которое собирает данные и отображает их в виде сводки многих каналов, по одному каналу на строку в TDrawGrid.У меня есть такое же приложение, работающее на других компьютерах в сети, но эти другие ПК являются ведомыми - они не собирают данные, а просто обеспечивают удаленное отображение сводки.

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

Я хочу реализовать это по-другому, чтобы уменьшить нагрузку на ведущее устройство ипредоставить ведомым устройствам немного больше гибкости и независимости в том, как они интерпретируют данные.Кроме того, у меня возникают проблемы с рассылкой почтовых ящиков данных по подсетям.

Могу ли я использовать некоторую схему общей памяти, чтобы поместить данные в файл с отображением в памяти, к которому подчиненные могут иметь доступ из любой точкидаже?)Мы говорим о максимальном объеме памяти в 100 Кбайт, скажем, обновляемом мастером примерно раз в секунду, вероятно, в потоке, чтобы обеспечить адаптацию задачи переднего плана.

Ответы [ 5 ]

4 голосов
/ 01 октября 2010

Общая память не будет работать через Интернет (если вы не используете VPN), и она не работает хорошо по сети в целом (представления могут быть десинхронизированы, и вы не можете синхронизировать их по сети).

Я вижу несколько решений вашей задачи:

Вариант 1. Используйте промежуточное программное обеспечение, ориентированное на сообщения (MOM), такое как MSMQ, kbmMW, наш MsgConnect, для широковещательных уведомлений, которые включают только изменения в ваших данных. Таким образом, клиентам не нужно будет дополнительно опрашивать сервер для получения снимка данных. Все решения MOM используют TCP-соединения для операций, и это более надежно, чем почтовые ящики.

Вариант 2. Использовать некоторую клиент-серверную СУБД, возможно, ту, которая поддерживает уведомления клиентов (я не специалист по DMBS, поэтому не могу назвать вам имена).

2 голосов
/ 01 октября 2010

Самый простой способ - использовать файл на общем ресурсе, в который ведущий пишет, а ведомые только читают. Может потребоваться какая-то синхронизация, если вы хотите предотвратить «грязное чтение». С другой стороны, это может не иметь значения, в зависимости от типа данных, которые вы хотите отобразить.

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

2 голосов
/ 01 октября 2010

Что не так с использованием TCP / IP? Вы можете использовать Indy (уже поставляется с Delphi) или ICS , чтобы ваше основное (главное) приложение отвечало на IP-запросы (например, HTTP или ICMP или любое другое, что соответствует вашим потребностям в данных). ) с потоком или двумя, и "ведомые" приложения просто запрашивают данные через IP-адрес мастера на конкретном порту. Это будет работать прозрачно во внутренней сети или через Интернет.

2 голосов
/ 01 октября 2010

Вы можете использовать базу данных, такую ​​как DBISAM, Firebird и т. Д. С DBISAM я использовал способ чтения первых 8 байтов файла базы данных, который выглядит как заголовок. Если это изменится, я знаю, что данные в таблице изменились, в противном случае это не изменилось. Вы можете использовать это в клиенте, если вы используете цикл опроса, или если вы хотите продолжать использовать почтовые ящики в качестве метода уведомления. т.е. опрашивать файл каждые 10 секунд или после уведомления почтового ящика, в зависимости от того, что наступит раньше.

0 голосов
/ 01 октября 2010

Мы используем MSMQ для чего-то подобного.

...