МПК с формами? - PullRequest
       26

МПК с формами?

1 голос
/ 04 ноября 2011

Я хочу сделать IPC, но я не могу использовать механизм блокировки (SendMessage, PIPE, TCP), и я не хочу использовать Threads (больше источников ошибок) или хранить данные (например, файлы, реестр).

Здесь 2-4 программного обеспечения на каждом ПК, и я хочу синхронизировать «наличие сообщений».

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

Я хочу использовать IPC, чтобы сказать «мастер», если состояние изменилось (пришло новое сообщение или все сообщения прочитаны) наМастер знает об этом, и мы избегаем этой ситуации: Мастер показывает лоток и всплывающее окно, а пользователь читает сообщения в другом приложении.В этом случае мастер не знает об этом и продолжает показывать элементы «нового сообщения».Или мастер прочитал все, но пришло новое сообщение.В это время мастер должен сообщить об этом.Потому что периоды проверки: обычное сообщение - 5 минут, будильник - 2 минуты.

Итак: почему я не использую блокирующий IPC, такой как SendMessage?Потому что, если мастер запускает большой запрос (5 ​​минут), тогда другие приложения блокируются на это время ..: - (

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

Тогда у меня есть идея, что каждая форма видима для «EnumWindows». Если сообщения хранятся в заголовке, я делаю PostMessage только с дескриптором этой формы,и Мастер может прочитать Заголовок, обработать сообщение. Если прошло 15 минут, мы игнорируем это сообщение, и окно «сообщения» уничтожается.

Хорошо, хорошо, это не элегантно, но я нене знаю ни о каком способе, который ничего не хранит в файлах и не может блокировать (асинхронно) - без чертовых потоков.

proc Send(Info : string):
  handles = EnumAndFindHandles();
  for handle in handles:
    o = CreateMessageForm(handle, Info);
    PostMessage(WM_MYMSG, handle, 11111, integer(o.Handle));

proc Recv(var Msg):
  if IsHandleValid(Msg.lParam) and ClassNameIsGood(Msg.lParam):
    txt = ReadWindowText(Msg.lParam);
    if txt > '':
       ...

Я хочу знать две вещи: 1.) Знаете ли вы какую-либо ситуациюкогда может эта связь не удалась?(Подпись отсутствует, изменена или другая вещь, которая может блокировать таким образом)?2.) Как я вижу, только формы могут отображаться в EnumWindows?Знаете ли вы, как сделать это с помощью другого элемента управления?

Спасибо за любые идеи, полезную информацию, предложения!

dd

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

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

1 голос
/ 04 ноября 2011

Подумайте об использовании StateLess aproach .

Вот некоторые преимущества:

  • Это не требует отправки обновлений на стороне сервера;
  • Вам не нужно ждать тайм-аута или проблемы со связью: клиенты обновляются по мере необходимости (например, с помощью таймера);
  • Это очень хорошо масштабируется в подходе клиент-сервер (с обеих сторон);
  • Модель потоковой архитектуры более чистая: клиент может использовать основной поток графического интерфейса, и каждое соединение с сервером может иметь свой собственный поток в режиме без сохранения состояния;
  • Вся сеть (через HTTP-протокол StateLess HTTP)) использует его - поэтому вы можете общаться с HTTP, который гораздо более дружественен к сети, чем другие протоколы.

Даже если вам все еще нужен локальный IPC, подумайте о переходе на дружественную к сети архитектуру.ваше будущее легче.Он также подготовит ваше приложение к переходу на SOA , если это необходимо.Например, наш клиент-сервер ORM без состояния может взаимодействовать локально с сообщениями GDI (как вы предлагаете) или именованными каналами, или удаленно, используя HTTP / 1.1.

...