netlib.narod.ru< Назад | Оглавление | Далее >

Класс Timer

Класс Timer невелик и относительно прост. Обычно объект Timer создается конструктором по умолчанию:

  Timer timer = new Timer();

Класс содержит одно событие:


Событие Timer



Событие Метод Делегат Аргумент

Tick OnTick EventHandler EventArgs


Где-то в вашем классе следует задать обработчик события для таймера:

  void TimerOnTick(object obj, EventArgs ea)
  {
      ...
  }

Естественно, вы можете присвоить ему любое другое имя. Далее следует сопоставить обработчик события созданному ранее объекту Timer.

  timer.Tick += new EventHandler(TimerOnTick);

В классе Timer всего два свойства:


Свойства Timer



Тип Имя Доступ Описание

int Interval Чтение/запись Интервал инициирования события в миллисекундах
bool Enabled Чтение/запись Для включения таймера устанавливается значение true


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

  timer.Interval = 1000;

Вы можете присвоить этому свойству значение 1, однако это не гарантирует выработки события таймера каждую миллисекунду. Например, в Windows 2000, даже если установить Interval в единицу таймер будет вызывать обработчик события примерно раз в 10 миллисекунд.

Windows округляет присвоенное значение в большую сторону до ближайшего числа, кратного периоду внутренних часов ОС. В Windows 2000, например, присвоение Interval значений от 11 до 20 приведет к вызову обработчика события таймера раз в 20 миллисекунд. Но и значение Interval, равное 20, не означает, что каждую секунду обработчик будет вызываться ровно 50 раз. Если инициированное таймером событие задерживается более, чем на 20 миллисекунд, оно объединяется со следующим событием таймера. В очереди может находиться только одно событие таймера.

Но вызовов обработчика событий не последует вовсе, пока таймер не будет включен:

  timer.Enabled = true;

Управлять работой таймера позволяют также следующие методы:


Методы Timer (выборочно)



void Start()
void Stop()


Вызов метода Start эквивалентен присваиванию свойству Enabled значения true, а метода Stop — присваиванию свойству Enabled значения false.

Эти свойства можно изменять в процедуре обработчика события таймера, тем самым сбрасывая его. Помните, что первым аргументом, передаваемым обработчику события, является объект, связанный с этим обработчиком. В данном случае это объект Timer, и получить доступ к нему можно так:

  Timer timer = (Timer) obj;

Следующая программа использует одноразовый (one-shot) таймер, который называется так потому, что во время обработки события таймера он выключается.

CloseInFive.cs

  //--------------------------------------------
  // CloseInFive.cs (C) 2001 by Charles Petzold
  //--------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class CloseInFive: Form
  {
      public static void Main()
      {
          Application.Run(new CloseInFive());
      }
      public CloseInFive()
      {
          Text = "Closing in Five Minutes";

          Timer timer    = new Timer();
          timer.Interval = 5 * 60 * 1000;
          timer.Tick    += new EventHandler(TimerOnTick);
          timer.Enabled  = true;
      }
      void TimerOnTick(object obj, EventArgs ea)
      {
          Timer timer = (Timer) obj;

          timer.Stop();
          timer.Tick -= new EventHandler(TimerOnTick);

          Close();
      }
  }

Обработчик события таймера не только выключает сам таймер, но и закрывает приложение. Эта программа является примером реализации демо-версии, которая дает возможность ознакомиться с преимуществами программы, но не позволяет использовать ее долгое время.

При закрытии приложения остановка таймера и отключение обработчика события не требуются, однако, если вы используете таймер для одноразовых действий, это будет полезно, поскольку в таком случае объект Timer будет уничтожен сборщиком мусора.

Примером другой крайности, противоположной CloseInFive, является усыпляющая программа, которая устанавливает таймер один раз и постоянно обрабатывает его события.

RandomRectangle.cs

  //------------------------------------------------
  // RandomRectangle.cs (C) 2001 by Charles Petzold
  //------------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class RandomRectangle: Form
  {
      public static void Main()
      {
          Application.Run(new RandomRectangle());
      }
      public RandomRectangle()
      {
          Text = "Random Rectangle";

          Timer timer    = new Timer();
          timer.Interval = 1;
          timer.Tick    += new EventHandler(TimerOnTick);
          timer.Start();
      }
      void TimerOnTick(object obj, EventArgs ea)
      {
          Random rand = new Random();

          int x1 = rand.Next(ClientSize.Width);
          int x2 = rand.Next(ClientSize.Width);
          int y1 = rand.Next(ClientSize.Height);
          int y2 = rand.Next(ClientSize.Height);

          Color color = Color.FromArgb(rand.Next(256), 
                                       rand.Next(256), 
                                       rand.Next(256));

          Graphics grfx = CreateGraphics();
          grfx.FillRectangle(new SolidBrush(color), 
                             Math.Min(x1,  x2), Math.Min(y1,  y2),
                             Math.Abs(x2 - x1), Math.Abs(y2 - y1));
          grfx.Dispose();
      }
  }

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz