90
Після старту сервер чекає першого запиту на зв’язок від мож-
ливого клієнта. Цей запит надходить у вигляді повідомлення
WM_COPYDATA. В коді програми ClientApp, який наводиться
нижче, можна побачити, що клієнт посилає в цьому повідомленні
рядок, який містить його ім’я (воно збігається із заголовком голо-
вного вікна додатка). Сервер витягує цей рядок request і додає до
нього суфікс, що містить символ підкреслення і номер запиту N.
Модифікований рядок запам’ятовується в елементі масиву event-
Name[N]. Потім сервер створює об’єкт-подію з дескриптором hEv-
tRecToServ[N] та ім’ям eventName[N].
Якщо запит, що надійшов, перший і N має нульове значення,
то сервер виконує ряд ініціюючих дій:
- Всі елементи масиву hEvtRecToServ[N] заповнюються зна-
ченнями дескриптора hEvtRecToServ[0]. Якщо цього не зробити,
то функція WaitForMultipleObjects, яка викликається пізніше для
масиву подій hEvtRecToServ, працювати не буде.
- Створюється об’єкт „проекція файла” з дескриптором hFile-
Map та ім’ям SharedData. При цьому розмір файла, що задається
четвертим і п’ятим параметрами функції CreateFileMapping, дорі-
внює 4 Кбайт. Ця величина повинна бути кратна розміру сторін-
ки пам’яті. А третій параметр визначає, що проекція файла буде
використовуватися і для запису, і для зчитування.
- Створюються об’єкти-події hEvtServIsFree та hEvtServIsDone.
- Запускається вторинний потік із вхідною функцією Thread-
Func. Цей потік призначений для обробки „робочих запитів” клі-
єнтів.
Завершуючи обробку прийнятого повідомлення
WM_COPYDATA, сервер відправляє ім’я eventName[N] назад
клієнту, використовуючи для цього все те ж повідомлення
WM_COPYDATA. Це повідомлення є відповіддю-оповіщенням
для клієнта (див. рис. 5.5).
Алгоритм функції потоку ThreadFunc досить простий. Як тіль-
ки сервер виявляє звільнення якої-небудь події з масиву hEvtRec-
ToServ, він визначає індекс клієнта і приступає до обробки „ро-
бочого запиту”. Зверніть увагу на те, що після запису „відповіді”
в розподілену пам’ять потік викликає функцію SetEvent, щоб пе-