"Разборчивые" события
"Разборчивые" события
Есть еще одно усовершенствование, которое можно внести в наш пример с CarEvents и которое соответствует шаблону событий, рекомендуемому разработчиками из Microsoft. При исследовании событий, посылаемых данным типом из библиотек базовых классов, вы обнаружите, что первым параметром соответствующего делегата является System.Object, а вторым – тип, производный от System.EventArgs.
Аргумент System.Object представляет ссылку на объект, посылающий событие (такой как, например, Car), а второй параметр представляет информацию о соответствующем событии. Базовый класс System.EventArgs представляет событие и не передает никакой пользовательской информации.
public class EventArgs {
public static readonly System.EventArgs Empty;
public EventArgs();
}
Для простых событий вы можете просто передать экземпляр EventArgs. Но если вы хотите передать и пользовательские данные, вы должны построить подходящий класс, производный от EventArgs. Для нашего примера мы предположим, что у нас есть класс CarEventArgs, который содержит строку с сообщением, отправляемым получателю.
public class CarEventArgs: EventArgs {
public readonly string msg;
public CarEventArgs(string message) {
msg = message;
}
}
Теперь мы должны обновить делегат CarEventHandler так, как показано ниже (события должны остаться без изменений).
public class Car {
public delegate void CarEventHandler(object sender, CarEventArgs e);
…
}
При генерировании событий из метода Accelerate() мы теперь должны предоставить ссылку на текущий объект Car (с помощью ключевого слова Car) и экземпляр нашего типа CarEventArgs.
public void Accelerate(int delta) {
// Если машина сломалась, генерируется событие Exploded.
if (carIsDead) {
if (Exploded != null) Exploded(this, new CarEventArgs("Извините, машина сломалась…"));
else {
…
AboutToBlow(this, new CarEventArgs("Осторожно! Могу сломаться!"));
}
…
}
}
С точки зрения вызывающей стороны, все, что нам требуется, так это обновление обработчиков событий, чтобы иметь возможность принять поступающие параметры и получить сообщение через доступное только для чтения поле. Например:
public static void CarAboutToBlow(object sender, CarEventArgs e) { Console.WriteLine ("{0} сообщает: {1}", sender, e.msg); }
Если получатель желает взаимодействовать с объектом, отправившим событие, следует выполнить явное преобразование System.Object. Так, если нужно выключить радио, когда объект Car уже на полпути к своему создателю, можно предложить обработчик событий, который будет выглядеть примерно так.
public static void CarIsAlmostDoomed(object sender, CarEventArgs e) {
// Просто для гарантии здесь перед вызовом предлагается
// проверка среды выполнения.
if (sender is Car) {
Car с = (Car)sender;
c.CrankTunes(false);
}
Console.WriteLine("Важное сообщение от {0}: {1}", sender, e.msg);
}
Исходный код. Проект PrimAndProperCarEvenfs размещен в подкаталоге, соответствующем главе 8.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
События
События Последним из рассматриваемых нами типов объектов синхронизации ядра являются события (events). Объекты события используются для того, чтобы сигнализировать другим потокам о наступлении какого-либо события, например, о появлении нового сообщения.Важной
Исключения и события MI
Исключения и события MI В MI различаются исключения и события. Исключение — это либо ошибка, обнаруженная машиной при исполнении команды, либо определенное состояние, обнаруженное пользовательской программой. Событие — это происшествие, возникающее в процессе работы
1.1.8. События
1.1.8. События Компонент TUUCode имеет только одно такое свойство:Событие OnProgress может использоваться как callback функция, позволяющая компоненту TUUCode выдавать текущий процент обработки входного файла. Использовать эту информацию вы можете с компонентами 16-битным TGauge или
Главные события
Главные события Когда выполняется процедура типа Sub, не отображающая форм, ваш программный код полностью контролирует, что и когда делает программа. Но если на экране отображается форма, программа переходит в каком-то смысле в пассивное состояние, ожидая инструкций от
События
События Событие представляет собой нечто, случающееся с объектом, и на что объект может ответить заранее предусмотренным действием. К событиям можно отнести следующее.* Физические действия пользователя программы, например щелчок кнопкой мыши, перемещение курсора,
Звуковые события
Звуковые события Звуковое сопровождение помогает лучше ориентироваться в происходящих событиях, и Windows XP имеет большое количество заготовок, необходимо только связать событие с конкретным звуковым файлом. Например, при получении писем – один звуковой сигнал, при
13.2.7. Ожидание события
13.2.7. Ожидание события Часто один или несколько потоков следят за «внешним миром», а остальные выполняют полезную работу. Все примеры в этом разделе надуманные, но общий принцип они все же иллюстрируют.В следующем примере прикладную задачу решают три потока. Четвертый
События в C#
События в C# Делегаты оказываются очень интересными конструкциями с той точки зрения, что они предоставляют возможность реализовать двухстороннее взаимодействие между объектами в памяти. Однако, и вы с этим согласитесь, работа с делегата-ми напрямую предполагает ввод
8.3. Метаданные события
8.3. Метаданные события Информация относительно событий может быть получена следующим образом:Запрос таблицы EVENTS базы данных INFORMATION_SCHEMAИспользование инструкции SHOW EVENTS.Использование инструкции SHOW CREATE EVENT.Запись событий, выполненных на сервере, может читаться из файла
События
События События Firebird являются "сигналами", которые модули PSQL могут накапливать в процессе выполнения для передачи клиентским приложениям, когда работа будет подтверждена. Клиентские приложения в сети могут прослушивать- с использованием обработчика сообщений-
Переменные события
Переменные события В Firebird появляются логические контекстные переменные INSERTING, UPDATING и DELETING, чтобы поддерживать условные переходы для триггеров, используемых для нескольких событий. Возможным синтаксисом ветвления может быть:IF ({INSERTING | UPDATING | DELETING}OR {UPDATING | DELETING | INSERTING}[OR
События
События События Firebird предоставляют механизм сигнализации, с помощью которого хранимые процедуры и триггеры могут передавать сообщения клиентским приложениям, когда другие приложения подтверждают изменения данных. Клиентские приложения устанавливаются в режим
1.1.7 События
1.1.7 События Когда пользователь нажимает на кнопку мыши или клавишу клавиатуры, или когда окно программы нуждается в перерисовке, или когда происходят другие изменения в системе, сервер подготавливает соответствующий пакет данных и отправляет его той или иной программе
Простейшие события
Простейшие события Рисование мышью в графическом окне Данная программа осуществляет рисование мышью в графическом окне:uses GraphABC;procedure MouseDown(x,y,mb: integer);beginMoveTo(x,y);end;procedure MouseMove(x,y,mb: integer);beginif mb=1 then LineTo(x,y);end;begin // Привязка обработчиков к событиямOnMouseDown := MouseDown;OnMouseMove :=
СОБЫТИЯ: Мы VAS не хотим!
СОБЫТИЯ: Мы VAS не хотим! 17-18 ноября в Санкт-Петербурге состоялась вторая специализированная международная конференция Mobile VAS Conference, на которую съехалось больше трехсот специалистов и представителей компаний из стран СНГ, Европы и Азии, действующих на рынке дополнительных