Я хочу сделать 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