Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Первинність повідомлень: механізм повідомлень

В об’єктно-орієнтованому програмуванні, як і в Windows, керуючі дані називаються ”повідомленнями”. Модель даних, що керують об’єктами, реалізується за допомогою спеціального механізму повідомлень. Більшість повідомлень, які отримує об’єкт ”вікно”, виникають в результаті дій користувача.

Але ідея повідомлень значно глибша. Повідомлення – це потужний (і єдиний) засіб зв’язку вікна (і всього продукту) з самою операційною оболонкою Windows. Через повідомлення „вікно” отримує інформацію про всі події в системі Windows, які мають відношення до самого вікна. Всі зовнішні у відношенні до програмного продукту події кодуються та у вигляді повідомлень направляються у чергу повідомлень.

Повідомлення мають єдиний формат, який за кількістю інформації, що надається набагато перевершує інші операційні оболонки. За допомогою повідомлень продукт отримує інформацію від таймера, про натискання клавіші, про пристрій, з якого отримано повідомлення і інше.

Наприклад: прихід сигналу від таймера керується повідомленням WM-TIMER; при збільшенні користувачем області „вікна” на екрані Windows надсилає продукту повідомлення WM-PAINT, яке повідомляє про те, що треба перемалювати область вікна і інше.

Саме цей механізм дозволяє в рамках однозадачної ОС емулювати багатозадачне, багатовіконне операційне середовище.

Розглянемо, як взаємодіють Windows та програмний продукт при обробці, наприклад, натискання клавіші.

 

 

При надходженні сигналу апаратура комп’ютера формує асинхронні переривання, які обробляються драйвером keyboard.drv. Драйвер викликає процедуру в модулі user.exe, який формує відповідне повідомлення. Це повідомлення, яке вміщує повну інформацію про подію, розміщається в системну чергу.

Системна черга в Windows одна. Повідомлення, які розміщаються в системній черзі, розподіляються потім між продуктами. Для кожного продукту Windows створює і підтримує окрему чергу повідомлень продукту. Розподіл полягає в тому, що повідомлення беруться з системної черги, визначається, якому „вікну” належить дане повідомлення і це повідомлення розміщується в чергу повідомлень продукту, якому належить вікно. Цю роботу виконує модуль user.exe.

Обробку черги повідомлень продукту виконує вже сам продукт. Для цього існує так званий цикл обробки повідомлень продукту, який бере повідомлення з черги, переводить їх в повідомлення ANSI (WM_CHAR) і направляє їх у відповідну функцію вікна продукту. Конкретні дії за даним повідомленням робляться вже функцією вікна.

Наприклад: якщо необхідно відобразити символ в області користувача вікна продукту, то це робить функція вікна продукту за допомогою бібліотечної процедури TextOut.

Клавіатура це ресурс, що розділяється Windows – її повідомлення можуть перенаправлятися довільному продукту.

Як Windows визначає, якому продукту направити повідомлення? Не дивлячись на те, що це багатозадачна оболонка, в якій може працювати декілька програм одночасно, ясно, що один користувач в кожний момент часу може працювати тільки з однією програмою. Кажуть, що продукт, в який попадають повідомлення від клавіатури в момент вводу, має фокус вводу. Фокус вводу може бути змінений користувачем за допомогою списку задач (task list), або за допомогою миші. Повідомлення від миші обробляється по іншому: вони передаються новому продукту, на полі вікна якого знаходиться курсор миші. Зрозуміло, чому повідомлення миші і клавіатури розміщуються спочатку в системну чергу і тільки потім надходять в чергу продукту – тому що багато повідомлень керують фокусом вводу, тому система повинна визначити якому продукту вони належать. Системна черга повідомлень, таким чином є засобом розподілення повідомлень між продуктами. Якщо наперед відомо, якому продукту належить те або інше повідомлення, то воно зразу розміщується в чергу продукту, повз системну чергу.

Так при роботі з таймером ми явно вказуємо, якому продуктові направляти повідомлення після закінченню певного часового інтервалу. Тому повідомлення таймера не треба розміщати в системну чергу, вони передаються безпосередньо в чергу продукту.

Механізм повідомлень – це засіб сумісного керування вікном продукту з боку Windows і з боку самого продукту. Продукт може створити декілька вікон, але ні одне із них не може підтримуватись тільки продуктом без Windows.

Наявність механізму повідомлень у багатозадачному середовищі дає цікавий наслідок:

- з одної сторони асинхронність подій знімається з операційної оболонки, оскільки послідовність подій прозора, всі повідомлення надходять в чергу продукту де є чітка черговість;

- з другої сторони, ця асинхронність переноситься на рівень задач, оскільки в кожний конкретний момент часу продукт не може знати про те, яке повідомлення він буде обробляти, далі в результаті дій користувача повідомлення може надійти в інший продукт.

Якщо звичайна DOS – програма отримує керування при завантаженні (або при виникненні певної події – обробка переривання) і передає його ОС тільки по закінченні роботи, то Windows – програма – де певна сукупність реакцій на зовнішні події, це об’єкт, який обробляє інформацію. Цей об’єкт значно масивніший ніж DOS – програма.

Модель програмування Windows в реалізовує одну з основний ідей об’єктно-орієнтованого програмування: дані (повідомлення) керують об’єктами (вікнами Windows).

Windows – програма, створивши вікно і підготувавши середовище програми, передає керування Windows і надалі, до завершення роботи, програма отримує керування від Windows тільки після надходження повідомлень, які належать даній програмі.

Створивши вікно продукту, WinMain() організує цикл повідомлень. Основне призначення цього циклу – обробка черги повідомлень даного продукту, яка створюється і підтримується Windows. Повідомлення, які Windows розміщує в чергу повідомлень продукту, беруться з неї циклом обробки повідомлень і направляються (не напряму а через Windows) в функцію керування відповідним вікном продукту.

З технічної точки зору отримання вікном повідомлення реалізовано як виклик функції вікна з операційної оболонки Windows. При цьому саме повідомлення виступає як набір параметрів спеціального формату, що передається функції вікна. Функція вікна не викликається напряму, тому що це суперечить прийнятій ідеології Windows – об’єкти спілкуються між собою тільки шляхом повідомлень.

Повідомлення можуть посилатися як Windows, так і іншим продуктами. Сам продукт може надсилати повідомлення сам собі через Windows. Це вимагається (і це єдиний спосіб) в тому випадку, коли треба передавати інформацію від одного вікна продукту до іншого. У Windows визначено велику кількість стандартних повідомлень. Створити і відправити своє власне повідомлення користуватись механізмом повідомлень, досить легко і зручно. Таким чином, після виконання WinMain() так званих “організаційних” дій, виклик функцій вікон можливий тільки передачею повідомлень (Див. рис __).

Цикл повідомлень (message loop) тільки вибирає повідомлення з черги повідомлень і направляє в функцію вікна, яку прийнято називати WndProc(). Саме вона формує команди, які виконують реальні дії:

– виконання команд меню;

– виконання виводу у вікно графіки, тексту;

– інші дії, які відносяться власне до продукту.

Не всі повідомлення попадають у функцію вікна продукту через цикл обробки повідомлень. Повідомлення підтримки вікна передаються Windows безпосередньо у функцію вікна продукту.

Наприклад: Якщо користувач закриває вікно, то після виконання відповідних операцій формується повідомлення WM_DESTROY, яке одразу направляється в функцію вікна продукту. Після виконання необхідних операцій (звільнення пам’яті, вилучення об’єктів і ін.) функція вікна продукту WndProc() повинна повідомити головній функції WinMain() про те, що вікно закрито і продукт повинен завершити свою роботу. Для цього WndProc() формує повідомлення WM_QUIT, яке розміщується в чергу повідомлень продукту.

 

 

Коли цикл обробки повідомлень бере з черги продукту повідомлення WM_QUIT, відбувається вихід з циклу повідомлень і продукт завершує роботу.

Windows – продукт не звертається до буферу клавіатури. Всі символи, що вводяться з клавіатури, Windows розміщує в системну чергу.

Перенаправлення вводу продукту відбувається шляхом копіюванням введених символів із системної черги в чергу продукту. Продукт, таким чином, бере весь ввід із своєї черги, яка також автоматично підтримується Windows. При цьому клавіші кодуються універсальними “віртуальними” кодами, які не залежать від типу клавіатури. Через системну чергу проходять не тільки натискання клавіш, але також всі натискання і переміщення миші. Крім того спілкування із самою системою Windows також відбувається через системну чергу і чергу продукту. Таким чином у Windows не треба створювати цикл опитування клавіатури, або створювати свій обробник переривання миші. При запуску продукту Windows автоматично створить ще одну чергу повідомлень через яку направлятимуться всі повідомлення призначені для цього продукту – як ввід користувача так і системні виклики.

Повідомлення Windows дуже різноманітні. Вони можуть бути (правда дуже умовно) розділені на класи за функціональними ознакам:

- системні повідомлення (WM_SYSCOMMAND, WM_SYSCHAR, …);

- повідомлення керування вікнами(WM_CREATE, WM_DESTROY, …);

- повідомлення багато віконного інтерфейсу MDI (WM_MDIGETACTIVE, WM_MDIDESTROY, …);

- повідомлення миші і клавіатури, біля 15 різновидів.

Завдяки багатозадачності Windows, можна одним продуктом стежити за повідомленнями, які Windows розміщує в черзі іншого продукту. (Це корисно при відлагодженні програми).

Повідомлення Windows не рівноправні і утворюють складну ієрархію. Старші повідомлення можуть породжувати одне або декілька молодих. І на кожному етапі вони, з одного боку, повністю доступні продукту, а з другого – утворюють, в принципі, ієрархію подій з безмежним числом рівнів.

В залежності від конкретної ситуації одне повідомлення може викликати цілий інформаційний вибух з двадцяти і більше повідомлень, які породжуються продуктами при їх взаємодії.

Таким чином механізм повідомлень виводить інформацію з–під підпорядкуванням програмам. Інформаційні повідомлення в Windows первинні, вони живуть своїм складним життям і не тільки не залежать від сегментів коду, але і керують ними.

<== предыдущая лекция | следующая лекция ==>
Зв’язування чи вбудовування | Незалежна (preemptive) багатозадачність
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 479; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.