
- •События
- •События. Определения
- •Прерывания
- •События. Нажатие кнопки мыши
- •События
- •Определения
- •Определения
- •Каждый подписчик должен иметь метод для обработки события подписки – обработчик события.
- •Синтаксис объявления события имеет вид:
- •Генерация и обработка события
- •//метод, в котором инициируется событие
- •static void handler2()
- •Широковещательные события (ШВС)
- •using System;
- •class X
- •class Test_Event
- •// инициирование события
- •В примере обработчики определены как методы экземпляра,
- •//класс, в котором инициируется событие
- •class Test_Event

События
События и обработчики событий - основа реализации графического интерфейса пользователя и работы всей программы:
реакция программы на события
таймера, мыши, клавиатуры, создания,
активизации или закрытия окна и т.д.
1

События. Определения
Методом сообщения системе о внешнем событии является аппаратное прерывание.
Идея прерывания (interrupt)- в момент события вызывать некоторую подпрограмму, которая выполнит действия по обработке события.
Прерывания, вызванные внутренними
событиями (в процессоре),
называют исключениями (exception).
Внешние прерывания - просто прерывания
Внутренние – исключения
2

Прерывания
Процессоры различают N типов прерываний.
Каждому типу соответствует процедура - обработчик.
Адреса точек входа всех процедур собраны в таблицу, называемую таблицей векторов прерываний.
Процессор получает запрос на прерывание.
Процессор завершает исполнение текущей команды и выставляет сигнал готовности к прерыванию.
Внешнее устройство выставляет на шине данных номер вектора прерывания.
Процессор считывает номер и вызывает соответствующую процедуру из таблицы векторов прерываний.
3

События. Нажатие кнопки мыши
В процедуре-обработчике (ОС) происходит поиск окна, находящегося под курсором мыши.
Если окно найдено, то данное событие посылается в очередь обработки сообщений этого окна.
Далее, в зависимости от типа окна, могут генерироваться дополнительные события.
Например, если окно является кнопкой, то дополнительно генерируется событие нажатия на кнопку (обработчик не содержит координат курсора - просто произведено нажатие на данную кнопку).
4

События
Обработчик события:
private void button1_Click(object sender, EventArgs
e)
{ MessageBox.Show("Была нажата кнопка"); }
В обработчик события передается sender
(содержит указатель на источник события) и дополнительные аргументы – объект e
можно использовать эти данные для обработки событий.
Пример объявления события:
public class MyClass
{ public event EventHandler MyEvent; }
EventHandler - делегат, определяющий тип обработчика
событий.
Подписка объекта на событие :
myClass.MyEvent += new EventHandler(Handler);
5

Определения
В C# событие определяется следующим образом:
с событием связывается
автоматическое извещение о
некотором происшедшем действии;
для объекта, который должен реагировать на какое-либо событие
регистрируется обработчик события;
обработчики событий создаются на основе делегатов;
когда событие происходит, вызываются все зарегистрированные обработчики.
6

Определения
Объекты, способные генерировать события, называются издателями.
Издатели - источники событий.
Объекты, зарегистрированные на уведомление о событиях (подписавшиеся на события), называются подписчиками, или абонентами.
Подписчики получают сообщения о событии.
У одного события м.б. несколько подписчиков.
7

Каждый подписчик должен иметь метод для обработки события подписки – обработчик события.
В случае события выполняются все обработчики.
Подписчик может зарегистрироваться на
несколько событий
у подписчика м.б. несколько различных обработчиков.
Объявление события
В C# событие объявляется как член класса.
Можно понимать событие как
специализированный многоадресный делегат, предназначенный для обработки событий.
8

Синтаксис объявления события имеет вид:
access event delegate_event event_name;
Здесь
delegate_event – имя делегата,
используемого для поддержки события,event_name - имя создаваемого объекта
события.
Данный делегат нужен для хранения ссылок
на имеющиеся обработчики данного события
Все обработчики активизируются с
помощью указанного в объявлении события делегата.
9

Генерация и обработка события
Пример 1. Иллюстрация схемы генерации и обработки события.
using System;
//объявление делегата для определения события
delegate void MyEventHandler ();
//класс, в котором инициируется событие
class MyEvent
{
//объявление события
public event MyEventHandler activate;
10