
- •5. Управление коммуникациями в ос
- •5.1. Общая характеристика коммуникаций
- •5.2. Концепции технологии Клиент-Сервер
- •5.3. Внутренние коммуникации между процессами
- •5.3.1. Неименованные каналы
- •5.3.2. Обмен сообщениями
- •5.3.3. Обмен данными через Clipboard
- •1. Подготовка данных для передачи в Clipboard;
- •1. Открытие Clipboard
- •2. Проверка наличия требуемого формата данных в Clipboard
- •3. Чтение данных из Clipboard
- •4. Закрытие Clipboard
- •5.3.4. Обмен данными по технологии dde
- •5.3.5. Обмен данными по технологии ole
- •5.3.5.1. Введение
- •5.3.5.2. Понятие документ-ориентированной среды
- •5.3.5.3. Принципы ole
- •5.3.5.4. Характеристика технологии ole
- •5.3.5.4.1. Ole реализует концепцию визуального редактирования - редактирования на месте.
- •5.3.5.4.2. Другой особенностью ole является возможность приложения предоставить ряд своих функций (например, проверку орфографии) для доступа из других приложений - ole-Automation.
- •5.3.5.4.3. Ядром ole стал способ хранения данных в составном документе.
- •5.3.5.4.4. Дополнительные возможности ole:
- •5.3.5.4.5. Иерархия средств ole
- •5.3.5.4.6. Недостатки ole
- •5.3.5.4.7. Трехуровневая адресация ole-объекта
- •5.4. Внешние коммуникации
- •5.4.1. Протоколы тср/ip
- •5.4.1.1. Определение и достоинства протокола tcp/ip
- •5.4.1.2. Архитектура tcp/ip
- •5.4.1.3. Соответствие между моделями tcp/ip и iso osi
- •5.4.2. Протокол ip
- •5.4.2.1. Структура заголовка ip-пакета
- •5.4.3. Протокол udp
- •5.4.4. Протокол tcp
- •5.4.4.1. Структура tcp-сегмента
- •5.4.4.2. Этапы tcp-сеанса
- •5.4.5. Программные средства поддержки сетей
- •5.4.5.1. Состав программных средств поддержки сетей
- •1. Почтовые ящики
- •2. Именованные каналы
- •3. Удаленные вызовы процедур
- •4. Протокол NetBios
- •5.4.5.2. Программные средства работы с сокетами
- •5.4.6. Сетевое программное обеспечение уровня приложений
- •5.4.6.1. Протокол ftp
- •5.4.6.2. Протокол smtp
5.3.2. Обмен сообщениями
Очень популярный механизм, ориентированный на управляемые событиями операционные среды. Он может быть использован как между объектами одного приложения, так и между разными приложениями.
Архитектура объектно-ориентированных событийно управляемых приложений существенно отличается от традиционных «линейных» (ДОС) приложений.
Грубо архитектуру линейного приложения можно представить следующим образом:
Call Proc1;
Call Proc2;
…
Call ProcN;
Архитектуру объектно-ориентированного приложения можно представить следующим образом:
Это набор объектов – программных конструкций, отображающих объекты реального мира.
Объекты не могут существовать сами по себе. Им присуще стремление взаимодействовать друг с другом.
Вопрос (
Можно выделить два способа взаимодействия объектов:
В методе одного объекта выполняется прямой вызов метода (который объявлен как доступный) другого объекта.
Обмен сообщениями между объектами.
)Вопрос
Вопрос (
Прямой вызов
)Вопрос
Вопрос (
Взаимодействие объектов через сообщения
)Вопрос
В сообщении указывается адрес получателя (другой объект) и данные. Некоторое средство, называемое Диспетчер, получает сообщения и перераспределяет их получателям.
Объекты в обязательном порядке должны иметь в своем составе метод-обработчик сообщения, т.е. функцию, которая вызывается при получении сообщения.
Доступной архитектурой такого типа является архитектура Turbo Vision, реализованная в среде ДОС компанией Borland. Можно сказать, что это был предвестник объектно-ориентированного программирования в среде Windows. ДОС-приложение, написанное в среде Turbo Vision, почти ничем не отличается объектно-ориентированного Windows-приложения.
В Windows-среде функции диспетчера выполняет ядро ОС, а в качестве объектов выступают экземпляры оконных классов. Метод-обработчик сообщений называют оконной функцией.
ОС собирает информацию о всех событиях, происходящих в системе, и рассылает эту информацию оконным функциям, для которых информация предназначена.
Сообщения могут создаваться как самой ОС в ответ на возникающие события, так и приложениями, точнее объектами приложения, в соответствии с характером прикладной задачи.
Вопрос (
Чтобы иметь возможность обмена сообщениями между объектами приложений, необходимо сообщение описать. Например:
UINT WM_SENDAPP;
Т.е. сообщение – это число целого типа.
)Вопрос
Вопрос (
Затем сообщение необходимо зарегистрировать в системе. Это делается функцией:
WM_SENDAPP = RegisterWindowMessage("SEND_APP");
Этот вызов возвращает уникальное для системы значение сообщения. Если все приложения вызовут данную функцию, то функция вернет всем приложениям одно и тоже значение, что является предпосылкой для возможности обмена сообщениями.
)Вопрос
Вопрос (
В объявление класса, который должен обрабатывать сообщение, включается обработчик сообщения:
afx_msg LRESULT SendApp(WPARAM wParam, LPARAM lParam);
В реализации класса создается код обработчика:
LRESULT CName::SendApp(WPARAM wParam, LPARAM lParam) {
AfxMessageBox("Test message!");
if (wParam == ...) {
}
if (lParam == ...) {
}
return result;
}
)Вопрос
Как осуществляется диспетчеризация (т. е. вызов нужного обработчика) сообщений? Надо реализовать оператор примерно следующего вида:
switch (msg) {
case WM_SENDAPP0 : SendApp0(wParam, lParam);
break;
case WM_SENDAPP1 : SendApp1(wParam, lParam);
break;
...
}
Если сообщений много, то оператор будет чрезвычайно громоздким. Поэтому создана другая технология, связывающая сообщение с обработчиком, называемая «message map». Идея состоит в том, что создается массив указателей на функции-обработчики, а индексами массива являются числовые значения сообщений.
На уровне приложения message map выглядит примерно следующим образом:
BEGIN_MESSAGE_MAP()
//{{AFX_MSG_MAP()
ON_WM_PAINT()
ON_REGISTERED_MESSAGE(WM_SENDAPP, SendApp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Другим важным моментом является понятие очереди сообщений. Драйвера внешних устройств конвертируют события, возникающие во внешней среде, в сообщения. Для преодоления асинхронности событий эти сообщения помещаются в очередь. Ядро циклически просматривает очередь сообщений, определяет адресата (например, окно, являющееся активным в данный момент) и отправляет сообщение ему. Отправка сообщения – это, по сути, вызов обработчика данного сообщения.
Другой тип сообщений, это сообщения, посылаемые объектам, минуя очередь. Этот вариант близок к варианту непосредственного вызова обработчика сообщения в объекте-получателе.
API Windows предлагает функции SendMessage() (синхронная) и PostMessage() (асинхронная) для обмена сообщениями между объектами.
Вопрос (
Функция SendMessage() завершается, когда завершится выполнение обработчика сообщения в объекте-получателе и возвращает результат обработки, т.е. то значение, которое обработчик вернет оператором return.
)Вопрос
Вопрос (
Функция PostMessage() кладет сообщение в системную очередь и сразу же возвращает управление приложению. Тем самым исключаются задержки в выполнении приложения, но и отсутствует результат обработки сообщения.
)Вопрос
Обе функции имеют одинаковый набор параметров:
BOOL PostMessage(
HWND hWnd, // получатель
UINT Msg, // сообщение
WPARAM wParam, // первый параметр
LPARAM lParam // второй параметр
);
Пример вызова функции:
if (!PostMessage(HWND_BROADCAST, WM_SENDAPP, 1, 1)) {
AfxMessageBox("Error");
}
Вопрос (
)Вопрос
Вопрос (
)Вопрос