обмен текстом между двумя процессами в ящике с использованием файла с отображением памяти

Требование состоит в том, чтобы иметь возможность общаться в чате, например, между двумя консольными приложениями в одном и том же окне Windows. Я реализовал это с помощью именованных каналов, реализуя функции отправителя и получателя в каждом приложении.

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

Для простоты предположим, что сообщения чата — это просто короткие строки.

Вот что я имею в виду:

Одно приложение позаботится о создании мьютекса и файла отображения памяти. Назовите его мастером.

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

Итак, всего четыре потока, каждый из которых управляется мьютексом для доступа к файлу.

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

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

Когда приложение считывает свой раздел файла для текста, если он есть, приложение считывает его и очищает свой раздел.

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

Кроме того, помимо того, что каждый поток чтения периодически пытается прочитать свой раздел файла, чтобы увидеть, есть ли новые данные, можете ли вы предложить какой-либо механизм уведомления? Типа обработки событий? Поток чтения будет искать новые сообщения только в том случае, если он получит какое-либо уведомление о событии.

есть идеи?


person Brian    schedule 19.12.2013    source источник
comment
Это далеко не идеально. Сообщения соответствуют потоковому протоколу. Уже хорошо покрыты именованным каналом, сокетом и очередью сообщений.   -  person Hans Passant    schedule 20.12.2013
comment
@HansPassant Я знаю, что это не идеально. Но если вы ограничены использованием одного файла с отображением памяти, каков будет подход?   -  person Brian    schedule 20.12.2013
comment
Если бы я был ограничен таким необоснованным техническим выбором без права голоса, я бы уволился с работы.   -  person Hans Passant    schedule 20.12.2013
comment
@HansPassant Забавно .. :) Кстати, это упражнение является частью собеседования при приеме на работу, и было упомянуто, что MMF - это вариант, мне просто любопытно, если это единственный выбор, как лучше всего это можно сделать. Я бы не хотел бросать работу еще до того, как меня наняли.   -  person Brian    schedule 20.12.2013
comment
Хм, да, ложный вопрос. Я даю много интервью, я знаю шаблон. Это стандартный трюк, не совсем мой любимый: предложить что-то совершенно нелепое и смотреть, как кандидат корчится, чтобы не сказать то, что он должен сказать. Вас проверяют не на ваше техническое мастерство, вас проверяют на способность иметь собственное мнение и иметь достаточную уверенность в себе, чтобы оно прижилось. Это очень важная черта, никто не хочет нанимать кодовую обезьяну. Худшее, что вы можете сделать, это не сказать, что вы думаете, только потому, что вы думаете, что интервьюер знает больше, чем вы.   -  person Hans Passant    schedule 20.12.2013


Ответы (1)


Я согласен с Гансом по большей части, файлы с отображением памяти не обязательно будут идеальными здесь, если вы пойдете по этому пути, хотя рассмотрите возможность использования именованного события (см. http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx) вместо опроса.

Вам может понадобиться p/invoke, чтобы получить эту функциональность из С#.

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

person Yaur    schedule 19.12.2013