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

Подійно-орієнтоване програмування (англ. 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- процедура-обробник. Подія може мати необмежену кількість обробників. При додаванні обробника події він додається до спеціального стек, а при виникненні події викликаються всі обробники за їх порядку в стеці. Відписка від події, тобто видалення обробника виконується аналогічно, але з використанням оператора «-=».

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

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

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

  • подійно-орієнтована обробка з «Azuki framework»
  • Подійна бібліотека мови Eiffel
  • Cocoa & Objective-C, рефлексивна об'єктно-орієнтована мова програмування, який додає повідомлення в стилі Smalltalk в мову Сі.
  • GLib
  • Gui4Cli, подійно-орієнтована мова програмування для Windows
  • event loop management library
  • Libsigc + +
  • Libevent
  • POCO
  • Libasync, частина бібліотек sfs і sfslite [2], ефективна подійна бібліотека для C++
  • Perl Object Environment
  • PRADO, компонентний подійно-орієнтований інструмент для Web-програмування на PHP 5
  • Tcl
  • Twisted, Python
  • The Qt Toolkit, a cross-platform GUI toolkit for C + + based on an event-driven model. A version called Qt / Console exists which omits the GUI features, but still includes the event-handling framework and some other features like cross-platform networking, threading, and XML libraries.
  • QP - родина відкритих подійно-орієнтованих середовищ для вбудованих систем реального часу

  • Simple Unix Events aka SUE, проста об'єктно-орієнтована бібліотека для побудови подійно-орієнтованих програм під Unix на мові C++.

Див. також

Джерела

Посилання

  1. Linux-Kernel Archive : Re: Alan Cox quote?. Архів оригіналу за 8 лютого 2008. Процитовано 6 квітня 2011.
  2. Архівована копія. Архів оригіналу за 29 березня 2010. Процитовано 6 квітня 2011.


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.