Прототип к варианту – 4 -- Большой супермаркет
На примере пары приложений клиент/сервер (см. прототип вар. 2) была продемонстрирована простейшая имитация супермаркета, в которой два приложения взаимодействовали через файловое отображение. Единственная проблема этой имитации заключалась в том, что при одновременном запуске двух клиентов она переставала работать. Сведения о покупках и продажах расходились — фактически программа начинала смешивать покупки двух разных клиентов.
Чрезвычайно простое решение этой проблемы приведено в проектах ckServe.vbp и ckClient.vbp из каталога этой главы на прилагаемом компакт-диске. В следующем разделе приведена сводка изменений, внесенных в версии этих приложений (см. прототип вар. 2).
Модификация ckServe.vbp
Добавьте следующий фрагмент в секцию объявлений формы:
Dim MutexHandle As Long ' Манипулятор мутекса для данного сервера
Добавьте следующий код в процедуру Cleanup формы:
Функция chkOpen_Click() должна выглядеть так, как показано ниже. Сервер создает мутекс с уникальным именем. Обратите внимание: само приложение-сервер не синхронизируется по мутексу — оно лишь создает его и предоставляет в распоряжение клиентских программ. Private Sub chkOpen_Click()
Модификация ckClient.vbp
Добавьте следующий фрагмент в секцию объявлений формы: Dim MutexHandle As Long
Добавьте следующий код в процедуру Cleanup формы:
Приведите функцию Timerl_Timer к виду, показанному ниже, и добавьте функцию GetMutexName. Единственное реальное отличие от исходной программы заключается в том, что в состоянии 2
появилось дополнительное условие, которое не позволяет переходить в состояние 3 приложению, не владеющему мутексом. Поскольку в любой момент времени мутекс принадлежит лишь одному приложению, это условие гарантирует, что лишь одно приложение сможет обратиться к памяти, обслуживаемой объектом файлового отображения.
После того как надобность в обращении к общей памяти отпадет, приложение освобождает мутекс и дает возможность поработать с сервером другим приложениям.
Рекомендации для самостоятельной работы
Приложения ckClient.vbp и ckServe.vbp развились из простого примера, и при их разработке возможность синхронизации не учитывались. О Переработайте конечный автомат и создайте дополнительное состояние для запроса доступа к общей памяти вместо того, чтобы объединять его с состоянием 2.
О Как бы вы подошли к реализации программы, поддерживающей работу нескольких серверов (то есть нескольких «касс»)? Разумеется, в распоряжение клиента необходимо предоставить некий механизм выбора. Возможны разные варианты. Например, можно просто выбрать случайный номер кассы или последовательно опробовать разные серверы. Поскольку каждый сервер обладает уникальным именем (имена файлового отображения и мутекса), вам будет нетрудно проверить, существует ли сервер с конкретным номером.
О После реализации схемы с несколькими серверами попробуйте воспользоваться семафорами для ограничения количества клиентов, поддерживаемых каждым сервером (количества клиентов, ожидающих в одной очереди).
О Рассмотрите приложение Launch. Подумайте, как переработать эти примеры, чтобы вместо реализованной методики опроса в них использовалась программа dwWatch.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.