Подійно-орієнтоване програмування

Подійно-орієнтоване програмування (англ. event-driven programming; надалі ПОП) — парадигма програмування, в якій виконання програми визначається подіями — діями користувача (клавіатура, миша), повідомленнями інших програм і потоків, подіями операційної системи (наприклад, надходженням мережевого пакета).

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

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

Сфера застосування ред.

Подійно-орієнтоване програмування, зазвичай застосовують в трьох випадках:

  1. При побудові користувацьких інтерфейсів (в тому числі графічних);
  2. При створенні серверних застосунків у разі, якщо з тих чи інших причин небажано породження обслуговуючих процесів;
  3. При програмуванні ігор, в яких здійснюється управління значною кількістю об'єктів.

Застосування в серверних програмах ред.

Подійно-орієнтоване програмування застосовується в серверних програмах для вирішення проблеми масштабування на 10000 одночасних з'єднань і більше.

У серверах, побудованих за моделлю «один потік на з'єднання», проблеми з масштабованістю виникають з наступних причин:

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

Філософською передумовою для відмови від потокової моделі серверів може служити вислів Алана Кокса: «Комп'ютер - це кінцевий автомат. Потокове програмування потрібно тим, хто не вміє програмувати кінцеві автомати »[1].

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

Мультиплексування ред.

Для мультиплексування сполук можуть бути використані наступні засоби операційної системи:

  • Select (більшість UNIX систем). Погано масштабується, через те, що список дескрипторів представлений у вигляді бітової карти;
  • Poll і epoll (Linux);
  • Kqueue (FreeBSD);
  • /Dev/poll ( Solaris);
  • IO completion port (Windows);
  • POSIX AIO на поточний момент тільки для операцій дискового введення-виведення;
  • Io submit і eventfd для операцій дискового введення-виведення.

Приклади реалізацій ред.

Застосування в настільних програмах ред.

У сучасних мовах програмування події та обробники подій є центральною ланкою реалізації графічного інтерфейсу користувача. Розглянемо, наприклад, взаємодію програми з подіями від миші. Натискання правої клавіші миші викликає системне переривання, що запускає певну процедуру всередині операційної системи. У цій процедурі відбувається пошук вікна, що знаходиться під курсором миші. Якщо вікно знайдено, то дана подія надсилається в чергу обробки повідомлень цього вікна. Далі, в залежності від типу вікна, можуть генеруватися додаткові події. Наприклад, якщо вікно є кнопкою (у Windows всі графічні елементи є вікнами), то додатково генерується подія натискання на кнопку. Відмінність останньої події в тому, що вона більш абстрактна, а саме, не містить координат курсору, а говорить просто про те, що було вироблено натискання на цю кнопку.

Обробник події може виглядати наступним чином (на прикладі C #):

        private void button1_Click (object sender, EventArgs e)
        {
            MessageBox.Show ("Була натиснута кнопка");
        }

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

Мови програмування ред.

У мові C# події реалізовані як елемент мови і є членами класів. Механізм подій тут реалізує шаблон проектування Publisher / Subscriber. Приклад оголошення події:

    public class MyClass
    {
        public event EventHandler MyEvent;
    }

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

            myClass.MyEvent + = new EventHandler (Handler);

ТутmyClass- екземпляр класуMyClass,Handler- процедура-обробник. Подія може мати необмежену кількість обробників. При додаванні обробника події він додається до спеціального стек, а при виникненні події викликаються всі обробники за їх порядку в стеці. Відписка від події, тобто видалення обробника виконується аналогічно, але з використанням оператора «-=».

Різні мови програмування підтримують ПОП в різному ступені. Найповнішу підтримку подій мають наступні мови (неповний список):

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

Інструменти і бібліотеки ред.

[1] [Архівовано 8 липня 2008 у Wayback Machine.]

Див. також ред.

Джерела ред.

Посилання ред.

  1. Linux-Kernel Archive : Re: Alan Cox quote?. Архів оригіналу за 8 лютого 2008. Процитовано 6 квітня 2011.
  2. Архівована копія. Архів оригіналу за 29 березня 2010. Процитовано 6 квітня 2011.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)