Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 127

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 121 122 123 124 125 126 < 127 > 128 129 130 131 132 133 .. 404 >> Следующая


n л i - t ? 11 с 1* -I rlfio. M111: nfjLinJf г j il L -ЧЦ[1г.и' n n i' li-tr: , 11 . ¦ fine- T11 i Li'iji

4 Hill nrk. at I; inn. Tlii' '. t'i i ijj I I -гцфС/и........ Il-iL- i И a I me

. f 11 i .¦ - i.. i ii 11 ui Ti я ОТваГ no'.- I fit

Как это работает

Объект, используемый для событий, представляет собой экземпляр класса System.Timers.Timer. При инициализации этого объекта задается интервал времени (в миллисекундах), После того как объект Timer запускается посредством вызова его метода start о, генерируется последовательность событий, отстоящих друг от друга во времени на заданную величину интервала. Функция Main о инициализирует объект Timer с временным интервалом, равным 100 миллисекундам, поэтому после запуска он генерирует события с частотой 10 раз в секунду:

static void Main(string[] args)

(

Timer myTimer = new Timer (100) ;
270 Глава 12

Объект Timer обладает событием, которое называется Elapsed (истек интервал), что можно увидеть, воспользовавшись окном Object Browser, представленным на рисунке слева.

Сигнатура, необходимая для обработчика рассматриваемого внда событий, соответствует типу делегата System.Timers.ElapsedEventHandler, который является одним из стандартных делегатов, определенных в .NET Framework. Этот делегат может использоваться для функций, обладающих следующей сигнатурой:

J J им ь там» ~ ¦ juu^ J6- h'&M1 - ~ Л| ,vj f

void function№me[-object source, ElapsedEventArgs e);

Объект Timer передает ссылку на самого себя в первом параметре и экземпляр объекта EiapeedEventAros — во втором. На данном этапе можно не обращать на эти параметры никакого внимания — позже мы вернемся к их рассмотрению.

В нашем коде имеется метод с совпадающей сигнатурой:

static void WriteChar(object source, ElapsedEventArgs e)

{

Console.Write(diaplayString[counter++ t dieplayString.Length]);

)

Данный метод использует два статических поля класса ciassi — counter и diaplayString — для вывода отдельного символа. При каждом вызове этого метода будет выводиться новый символ.

Следующая задача — привязать этот обработчик к событию, т. е. подписаться иа событие. С этой целью используется оператор который позволяет включить в событие обработчик в виде нового экземпляра делегата, инициализированного с используемым методом обработчика событий:

static void Main{string!J args)

{

Timer myTimer = new Timer (100) ;

myTimer.Tick «-= new EventHandler(WriteChar)t

Эта команда (где используется присущий делегатам странный на вид синтаксис) добавляет обработчик в список обработчиков, вызываемых при возникновении события Elapsed. Можно добавлять в этот список сколь угодно много обработчиков, при этом все они должны удовлетворять требуемому критерию. Каждый из этнх обработчиков будет вызываться при наступлении события поочередно.

Все, что осталось необходимым выполнить в функции Main о,— это запустить таймер:

myTimer.Start() ;

Поскольку ие нужно, чтобы приложение окончилось до того, как будет обработано хотя бы одио событие, то следует приостановить выполнение функции Main о. Простейшим способом, такой приостановки является ожидание ввода пользователя, так как выполнение этой команды не сможет завершиться ранее, чем пользователь введет строку текста н/илн нажмет клавишу Enter,

Console.ReadLine();

>
События

271

Хотя выполнение метода Main!) фактически оказывается остановленным, объект Timer продолжает функционировать. При наступлении очередного события он вызывает описанный метод wriceCharo, который выполняется параллельно с выполнением оператора Console.ReadLineО .

Определение событий

В качестве примера определения и использования событий нужно реализовать версию программы немедленной отправки сообщений, рассмотренную в начале этой главы, н создать объект Connection (соединение), который будет генерировать события, обрабатывающиеся объектом Display (вывод).

Практикум: Определение событий

1. Создайте новое консольное приложение с именем chl2Ex02 В директории C:\BeaCSharp\Chapterl2\.

2. Добавьте новый класс — Connection — в файл Connection.ca:

using System.Timers; namespace Chl2ExQ2

public delegate void HesaogeHandler (string measageText)j ..

public class Connection

)

)

>
272

Глава 12

3. Добавьте НОВЫЙ класс — Display — В файл Display, cs:

using System;

namespace Chl2ExQ2 С

public class Display (

public void DifiplayMeaeage(string message) f

Console.WriteLlne('Messaee arrived: CO) message);

)

>

)

4. Внесите следующие изменения в файл Classi.cs:

using System; namespace Chl2ExQ2 (

class Classl (

static void Main(string!) args)

(

Connection myConnection 1 new Connection () ;

Display myDisplay = new Display I); jnyConnection.Messageftrrived

new MesaaaeHandler (inyDieplay .DisplayMeasaae) ; nyConnection.Connect();

Console,ReadLine()t

}

)

}

5. Запустите приложение (см. рис. слева).

Как это работает

Класс, который выполняет львшгую долю работы в данном приложении,— это класс
Предыдущая << 1 .. 121 122 123 124 125 126 < 127 > 128 129 130 131 132 133 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.