Практическое руководство. Выполнение процедур с заданными интервалами с помощью компонента таймера Windows Forms
Иногда может потребоваться создать процедуру, которая выполняется в определенных интервалах времени, пока цикл не завершится или что выполняется при истечении заданного интервала времени. Компонент Timer делает такую процедуру возможной.
Этот компонент предназначен для среды Windows Forms. Если вам нужен таймер, подходящий для среды сервера, см. введение по Server-Based таймерам.
Заметка
При использовании компонента Timer существуют некоторые ограничения. Дополнительные сведения см. в разделе Ограничения свойства интервала компонента таймера Windows Forms.
Выполнение процедуры с заданными интервалами с помощью компонента Таймера
Добавьте Timer в форму. См. следующий раздел "Пример" для иллюстрации того, как это сделать программным способом. Visual Studio также поддерживает добавление компонентов в форму. См. также руководство "Как: Добавить элементы управления без пользовательского интерфейса в Windows Forms".
Задайте для таймера свойство Interval (в миллисекундах). Это свойство определяет, сколько времени будет проходить до повторного выполнения процедуры.
Заметка
Чем чаще происходит событие таймера, тем больше времени процессора используется при реагировании на событие. Это может замедлить общую производительность. Не устанавливайте меньший интервал, чем вам нужно.
Напишите соответствующий код в обработчике событий Tick. Код, который вы пишете в этом событии, будет выполняться через интервал, указанный в свойстве Interval.
Задайте для свойства Enabled значение
true
, чтобы запустить таймер. Событие Tick начнет выполняться, и ваша процедура будет запускаться с заданным интервалом.В соответствующее время задайте для свойства Enabled значение
false
, чтобы остановить выполнение процедуры снова. Установка интервала в0
не приводит к остановке таймера.
Первый пример кода
Этот первый пример кода отслеживает время дня с одной секундными интервалами. Он использует Button, Labelи компонент Timer в форме. Свойство Interval имеет значение 1000 (равно одному секунде). В событии Tick заголовок метки задается в текущее время. При нажатии кнопки свойство Enabled получает значение false
, что останавливает таймер от обновления надписи метки. В следующем примере кода требуется, чтобы у вас была форма с элементом управления Button с именем Button1
, элементом управления Timer с именем Timer1
и элементом управления Label с именем Label1
.
Private Sub InitializeTimer()
' Run this procedure in an appropriate event.
' Set to 1 second.
Timer1.Interval = 1000
' Enable timer.
Timer1.Enabled = True
Button1.Text = "Enabled"
End Sub
x
Private Sub Timer1_Tick(ByVal Sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
' Set the caption to the current time.
Label1.Text = DateTime.Now
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Button1.Text = "Stop" Then
Button1.Text = "Start"
Timer1.Enabled = False
Else
Button1.Text = "Stop"
Timer1.Enabled = True
End If
End Sub
private void InitializeTimer()
{
// Call this procedure when the application starts.
// Set to 1 second.
Timer1.Interval = 1000;
Timer1.Tick += new EventHandler(Timer1_Tick);
// Enable timer.
Timer1.Enabled = true;
Button1.Text = "Stop";
Button1.Click += new EventHandler(Button1_Click);
}
private void Timer1_Tick(object Sender, EventArgs e)
{
// Set the caption to the current time.
Label1.Text = DateTime.Now.ToString();
}
private void Button1_Click(object sender, EventArgs e)
{
if ( Button1.Text == "Stop" )
{
Button1.Text = "Start";
Timer1.Enabled = false;
}
else
{
Button1.Text = "Stop";
Timer1.Enabled = true;
}
}
private:
void InitializeTimer()
{
// Run this procedure in an appropriate event.
// Set to 1 second.
timer1->Interval = 1000;
// Enable timer.
timer1->Enabled = true;
this->timer1->Tick += gcnew System::EventHandler(this,
&Form1::timer1_Tick);
button1->Text = S"Stop";
this->button1->Click += gcnew System::EventHandler(this,
&Form1::button1_Click);
}
void timer1_Tick(System::Object ^ sender,
System::EventArgs ^ e)
{
// Set the caption to the current time.
label1->Text = DateTime::Now.ToString();
}
void button1_Click(System::Object ^ sender,
System::EventArgs ^ e)
{
if ( button1->Text == "Stop" )
{
button1->Text = "Start";
timer1->Enabled = false;
}
else
{
button1->Text = "Stop";
timer1->Enabled = true;
}
}
Второй пример кода
Второй пример кода выполняет процедуру каждые 600 миллисекунд до завершения цикла. В следующем примере кода требуется, чтобы у вас была форма с элементом управления Button с именем Button1
, элементом управления Timer с именем Timer1
и элементом управления Label с именем Label1
.
' This variable will be the loop counter.
Private counter As Integer
Private Sub InitializeTimer()
' Run this procedure in an appropriate event.
counter = 0
Timer1.Interval = 600
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If counter => 10 Then
' Exit loop code.
Timer1.Enabled = False
counter = 0
Else
' Run your procedure here.
' Increment counter.
counter = counter + 1
Label1.Text = "Procedures Run: " & counter.ToString
End If
End Sub
// This variable will be the loop counter.
private int counter;
private void InitializeTimer()
{
// Run this procedure in an appropriate event.
counter = 0;
timer1.Interval = 600;
timer1.Enabled = true;
// Hook up timer's tick event handler.
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
}
private void timer1_Tick(object sender, System.EventArgs e)
{
if (counter >= 10)
{
// Exit loop code.
timer1.Enabled = false;
counter = 0;
}
else
{
// Run your procedure here.
// Increment counter.
counter = counter + 1;
label1.Text = "Procedures Run: " + counter.ToString();
}
}
private:
int counter;
void InitializeTimer()
{
// Run this procedure in an appropriate event.
counter = 0;
timer1->Interval = 600;
timer1->Enabled = true;
// Hook up timer's tick event handler.
this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
}
void timer1_Tick(System::Object ^ sender,
System::EventArgs ^ e)
{
if (counter >= 10)
{
// Exit loop code.
timer1->Enabled = false;
counter = 0;
}
else
{
// Run your procedure here.
// Increment counter.
counter = counter + 1;
label1->Text = String::Concat("Procedures Run: ",
counter.ToString());
}
}
См. также
.NET Desktop feedback