В разработке приложений на платформе Windows Forms в C# часто возникает необходимость выполнять задачи через регулярные интервалы времени. Для этого используется компонент Timer. Этот компонент позволяет запускать определенные действия через заданные промежутки времени, что особенно полезно для создания анимаций, обновления данных или выполнения периодических проверок.
Основные концепции Timer
Компонент Timer в Windows Forms предоставляет простой способ управления временными интервалами в приложении. Основные характеристики Timer включают:
- Интервал: Время в миллисекундах между тиками таймера.
- Событие Tick: Событие, которое происходит каждый раз, когда интервал таймера истекает.
- Запуск и остановка: Методы для запуска и остановки таймера.
Как добавить Timer в проект
- Добавление Timer через дизайнер:
- Откройте ваш проект в Visual Studio.
- Перейдите на вкладку «Toolbox» (Ящик с инструментами).
-
Найдите компонент
Timer
и перетащите его на форму. -
Настройка свойств Timer:
- Выберите компонент Timer на форме.
- В окне свойств установите значение для Interval (например, 1000 миллисекунд для интервала в одну секунду).
- Дважды щелкните на компоненте Timer, чтобы создать обработчик события
Tick
.
Пример использования Timer
Рассмотрим простой пример использования Timer для обновления текста на кнопке каждую секунду:
using System;
using System.Windows.Forms;
namespace TimerExample
{
public partial class Form1 : Form
{
private int counter = 0;
public Form1()
{
InitializeComponent();
timer1.Interval = 1000; // Установите интервал в 1000 миллисекунд (1 секунда)
timer1.Tick += Timer1_Tick;
timer1.Start(); // Запустите таймер
}
private void Timer1_Tick(object sender, EventArgs e)
{
counter++;
button1.Text = "Счетчик: " + counter.ToString();
}
}
}
Объяснение кода
- Инициализация Timer: В конструкторе формы устанавливается интервал таймера и назначается обработчик события Tick.
- Обработчик события Tick: Каждый раз, когда таймер «тикает» (то есть интервал истекает), выполняется код внутри Timer1_Tick. В данном примере счетчик увеличивается, и текст кнопки обновляется.
- Запуск Timer: Таймер запускается с помощью метода Start().
Дополнительные возможности
- Остановка таймера: Вы можете остановить таймер с помощью метода Stop().
- Одноразовый таймер: Если вам нужно выполнить действие только один раз через определенный интервал, вы можете остановить таймер в обработчике события Tick.
Заключение
Компонент Timer в Windows Forms предоставляет мощный и простой способ управления временными интервалами в вашем приложении. Он позволяет легко выполнять повторяющиеся задачи, такие как обновление пользовательского интерфейса, выполнение фоновых операций или создание анимаций. Использование Timer помогает сделать ваше приложение более динамичным и отзывчивым.
Также, рекомендую видеокурс Программирование на C# с Нуля до Гуру, в котором подробнее рассказано о различных способах создания программ на C#
-
Создано 19.03.2025 13:05:49
-
Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
Она выглядит вот так:
-
Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
Последнее обновление: 31.10.2015
TrackBar
TrackBar представляет собой элемент, который с помощью перемещения ползунка позволяет вводить числовые значения.
Некоторые важные свойства TrackBar:
-
Orientation: задает ориентацию ползунка — расположение по горизонтали или по вертикали
-
TickStyle: задает расположение делений на ползунке
-
TickFrequency: задает частоту делений на ползунке
-
Minimum: минимальное возможное значение на ползунке (по умолчанию 0)
-
Maximum: максимальное возможное значение на ползунке (по умолчанию 10)
-
Value: текущее значение ползунка. Должно находиться между Minimum и Maximum
Свойство TickStyle
может принимать ряд значений:
-
None
: деления отсутствуют -
Both
: деления расположены по обеим сторонам ползунка -
BottomRight
: у вертикального ползунка деления находятся справа, а у горизонтального — снизу -
TopLeft
: у вертикального ползунка деления находятся слева, а у горизонтального — сверху (применяется по умолчанию)
К наиболее важным событиям элемента следует отнести событие Scroll, которое позволяет обработать перемещение
ползунка от одного деления к другому. Что может быть полезно, если нам надо, например, устанавливать соответствующую громкость звука в
зависимости от значения ползунка, либо какике-нибудь другие настройки:
public partial class Form1 : Form { public Form1() { InitializeComponent(); // установка обработчика события Scroll trackBar1.Scroll+=trackBar1_Scroll; } private void trackBar1_Scroll(object sender, EventArgs e) { label1.Text = String.Format("Текущее значение: {0}", trackBar1.Value); } }
Timer
Timer является компонентом для запуска действий, повторяющихся через определенный промежуток времени. Хотя он не является
визуальным элементом, но его аткже можно перетащить с Панели Инструментов на форму:
Наиболее важные свойства и методы таймера:
-
Свойство Enabled: при значении true указывает, что таймер будет запускаться вместе с запуском формы
-
Свойство Interval: указывает интервал в миллисекундах, через который будет срабатывать обработчик события Tick, которое есть у таймера
-
Метод Start(): запускает таймер
-
Метод Stop(): останавливает таймер
Для примера определим простую форму, на которую добавим кнопку и таймер. В файле кода формы определим следующий код:
public partial class Form1 : Form { int koef = 1; public Form1() { InitializeComponent(); this.Width = 400; button1.Width = 40; button1.Left = 40; button1.Text = ""; button1.BackColor = Color.Aqua; timer1.Interval = 500; // 500 миллисекунд timer1.Enabled = true; button1.Click += button1_Click; timer1.Tick += timer1_Tick; } // обработчик события Tick таймера void timer1_Tick(object sender, EventArgs e) { if (button1.Left == (this.Width-button1.Width-10)) { koef=-1; } else if (button1.Left == 0) { koef = 1; } button1.Left += 10 *koef; } // обработчик нажатия на кнопку void button1_Click(object sender, EventArgs e) { if(timer1.Enabled==true) { timer1.Stop(); } else { timer1.Start(); } } }
Здесь в конструкторе формы устанавливаются начальные значения для таймера, кнопки и формы.
Через каждый интервал таймера будет срабатывать обработчик timer1_Tick
, в котором изменяется положение
кнопки по горизонтали с помощью свойства button1.Left
. А с помощью дополнительной переменной koef
можно управлять направлением движения.
Кроме того, с помощью обраотчика нажатия кнопки button1_Click
можно либо остановить таймер (и вместе с ним движение
кнопки), либо опять его запустить.
Индикатор прогресса ProgressBar
Элемент ProgressBar служит для того, чтобы дать пользователю информацию о ходе выполнения какой-либо задачи.
Наиболее важые свойства ProgressBar:
-
Minimum: минимальное возможное значение
-
Maximum: максимальное возможное значение
-
Value: текущее значение элемента
-
Step: шаг, на который изменится значение Value при вызове метода
PerformStep
Для имитации работы прогрессбара поместим на форму таймер и в коде формы определим следующий код:
public partial class Form1 : Form { public Form1() { InitializeComponent(); timer1.Interval = 500; // 500 миллисекунд timer1.Enabled = true; timer1.Tick += timer1_Tick; } // обработчик события Tick таймера void timer1_Tick(object sender, EventArgs e) { progressBar1.PerformStep(); } }
Разбираем создание таймера на языке программирования C# в приложении Windows Forms. Полный исходный код с подробными комментариями можно будет скачать внизу страницы.
Для начала в Windows Forms создаём внешнюю оболочку программы. У нас она выглядит вот так:
Здесь у нас 8 Label’ов, 3 TextBox’a, 3 Buttom’a и сам Timer.
Примечание: при переносе элемента Timer в форму, на неё ничего не появляется. Лишь в нижней части окна программы под формой появляется значок , не пугайтесь.
Щёлкнем на значок таймера и в окне «Свойства» в группе «Поведение» устанавливаем значение параметра Interval равным 1000. Данный параметр определяет длину тика таймера в миллисекундах, указав 1000, мы сделали один тик равным одной секунде.
После оформления и настройки приступаем к коду. Вводим целочисленные переменные h — часы, m- минуты, s — секунды.
Затем дважды щёлкаем мышью на кнопке «Старт» и переходим на участок кода, отвечающий за клик на эту кнопку.
Туда мы пишем следующий код:
h = Convert.ToInt32(textBox1.Text); m = Convert.ToInt32(textBox2.Text); s = Convert.ToInt32(textBox3.Text); timer1.Start(); |
То есть мы считываем с TextBox’ов данные, которые ввёл туда пользователь, и после этого включаем таймер. Время пошло.
Также нам надо настроить счёт времени самого таймера. Для этого дважды кликаем на элементе и внутри тела кода, в который нас отправило, пишем:
private void timer1_Tick(object sender, EventArgs e) { s = s — 1; if (s == —1) { m = m — 1; s = 59; } |
Здесь мы настраиваем таймер таким образом, чтобы каждую секунду переменная s уменьшалась на единицу. Если s становится меньше нуля, значит прошла минута, следовательно, m должна уменьшаться на единицу, а отсчёт с секундами s снова начнётся с 59.
То же самое мы делаем с часами и минутами:
if (m==-1) { h = h — 1; m = 59; } |
Теперь позаботимся о том, что случится, когда время, указанное пользователем, выйдет:
if (h==0 && m==0 && s==0) { timer1.Stop(); MessageBox.Show(«Время вышло!»); } |
Как только часы, минуты и секунды будут вместе ровняться нулю, мы выведем пользователю окно с предупреждением об этом.
А чтобы пользователь мог видеть, как идёт время, и как отсчитываются часы, минуты и секунды, мы вынесем всё вышепроисходящее на экран при помощи label’ов:
label1.Text = Convert.ToString(h); label3.Text = Convert.ToString(m); label5.Text = Convert.ToString(s); |
Теперь надо разобраться с кнопками «Стоп» и «Сброс». В первом случае при нажатии на кнопку пользователем, таймер просто останавливается и может быть возобновлён после нажатия на кнопку «Старт». При нажатии на вторую кнопку счётчики сбрасываются и при нажатии на «Старт», отчёт начнётся заново.
Код кнопки «Стоп»:
private void button2_Click(object sender, EventArgs e) { timer1.Stop(); } |
Тут всё просто и понятно.
В кнопке «Сброс» нам надо помимо остановки сбросить значения переменных до нулей:
private void button3_Click(object sender, EventArgs e) { timer1.Stop(); label1.Text = «0»; label3.Text = «0»; label5.Text = «0»; } |
Программа готова. Таймер на C#:
Скачать исходник
Синтаксис
-
myTimer.Interval
— устанавливает, как часто вызывается событие «Tick» (в миллисекундах) -
myTimer.Enabled
— логическое значение, которое устанавливает таймер для включения / отключения -
myTimer.Start()
— запуск таймера. -
myTimer.Stop()
— останавливает таймер.
замечания
Если вы используете Visual Studio, таймеры могут быть добавлены в виде элемента управления непосредственно в вашу форму из панели инструментов.
Многопоточные таймеры
System.Threading.Timer
— Простой многопоточный таймер. Содержит два метода и один конструктор.
Пример: таймер вызывает метод DataWrite, который пишет «многопоточность, выполненный …», по прошествии пяти секунд, а затем каждую секунду после этого, пока пользователь не нажмет Enter:
using System;
using System.Threading;
class Program
{
static void Main()
{
// First interval = 5000ms; subsequent intervals = 1000ms
Timer timer = new Timer (DataWrite, "multithread executed...", 5000, 1000);
Console.ReadLine();
timer.Dispose(); // This both stops the timer and cleans up.
}
static void DataWrite (object data)
{
// This runs on a pooled thread
Console.WriteLine (data); // Writes "multithread executed..."
}
}
Примечание. Будет опубликован отдельный раздел для утилизации многопоточных таймеров.
Change
Этот метод можно вызвать, если вы хотите изменить интервал таймера.
Timeout.Infinite
— если вы хотите запустить только один раз. Задайте это в последнем аргументе конструктора.
System.Timers
— еще один класс таймера, предоставляемый .NET Framework. Он обертывает System.Threading.Timer
.
Особенности:
-
IComponent
—IComponent
его размещение в лотке компонента Designer в Visual Studio - Свойство
Interval
вместо методаChange
-
Elapsed
event
вместоdelegate
обратного вызова -
Enabled
для запуска и остановки таймера (default value = false
) -
Start
&Stop
если вы запутались в свойствеEnabled
(выше точки) -
AutoReset
— для указания повторяющегося события (default value = true
) - Свойство
SynchronizingObject
с методамиInvoke
иBeginInvoke
для безопасных методов вызова элементов WPF и элементов управления Windows Forms
Пример, представляющий все перечисленные выше функции:
using System;
using System.Timers; // Timers namespace rather than Threading
class SystemTimer
{
static void Main()
{
Timer timer = new Timer(); // Doesn't require any args
timer.Interval = 500;
timer.Elapsed += timer_Elapsed; // Uses an event instead of a delegate
timer.Start(); // Start the timer
Console.ReadLine();
timer.Stop(); // Stop the timer
Console.ReadLine();
timer.Start(); // Restart the timer
Console.ReadLine();
timer.Dispose(); // Permanently stop the timer
}
static void timer_Elapsed(object sender, EventArgs e)
{
Console.WriteLine ("Tick");
}
}
Multithreaded timers
— используйте пул потоков, чтобы несколько потоков могли обслуживать множество таймеров. Это означает, что метод обратного вызова или Elapsed
событие может запускаться по другому потоку каждый раз, когда он вызывается.
Elapsed
— это событие всегда срабатывает вовремя, независимо от того, является ли предыдущим Elapsed
закончило событие выполнения. Из-за этого обратные вызовы или обработчики событий должны быть потокобезопасными. Точность многопоточных таймеров зависит от ОС и обычно составляет 10-20 мс.
interop
— когда вам нужна более высокая точность, используйте это и вызовите мультимедийный таймер Windows. Это имеет точность до 1 мс и определяется в winmm.dll
.
timeBeginPeriod
— сначала timeBeginPeriod
это, чтобы сообщить ОС, что вам нужна высокая точность синхронизации
timeSetEvent
— вызывать это через timeBeginPeriod
для запуска мультимедийного таймера.
timeKillEvent
— вызывать это, когда вы закончите, это останавливает таймер
timeEndPeriod
— вызов этого, чтобы сообщить ОС, что вам больше не нужна высокая точность синхронизации.
Вы можете найти полные примеры в Интернете, которые используют мультимедийный таймер, dllimport
поиск ключевых слов dllimport
winmm.dll
timesetevent
.
Создание экземпляра таймера
Таймеры используются для выполнения задач через определенные промежутки времени (до X каждые Y секунд). Ниже приведен пример создания нового экземпляра таймера.
ПРИМЕЧАНИЕ . Это относится к таймерам, использующим WinForms. Если вы используете WPF, вы можете посмотреть в DispatcherTimer
using System.Windows.Forms; //Timers use the Windows.Forms namespace
public partial class Form1 : Form
{
Timer myTimer = new Timer(); //create an instance of Timer named myTimer
public Form1()
{
InitializeComponent();
}
}
Назначение обработчика события «Tick» для таймера
Все действия, выполняемые таймером, обрабатываются в событии «Tick».
public partial class Form1 : Form
{
Timer myTimer = new Timer();
public Form1()
{
InitializeComponent();
myTimer.Tick += myTimer_Tick; //assign the event handler named "myTimer_Tick"
}
private void myTimer_Tick(object sender, EventArgs e)
{
// Perform your actions here.
}
}
Пример: использование таймера для простого обратного отсчета.
public partial class Form1 : Form
{
Timer myTimer = new Timer();
int timeLeft = 10;
public Form1()
{
InitializeComponent();
//set properties for the Timer
myTimer.Interval = 1000;
myTimer.Enabled = true;
//Set the event handler for the timer, named "myTimer_Tick"
myTimer.Tick += myTimer_Tick;
//Start the timer as soon as the form is loaded
myTimer.Start();
//Show the time set in the "timeLeft" variable
lblCountDown.Text = timeLeft.ToString();
}
private void myTimer_Tick(object sender, EventArgs e)
{
//perform these actions at the interval set in the properties.
lblCountDown.Text = timeLeft.ToString();
timeLeft -= 1;
if (timeLeft < 0)
{
myTimer.Stop();
}
}
}
Результаты в …
И так далее…
Нужно сделать,чтобы можно было ставить на 5 минут таймер и это все отображалось в label(например так: 4:58)и с каждой секундой из этого текущего времени минус 1
Есть код:
int i;
private void Button1_Click(object sender, EventArgs e)
{
i = 45;
label1.Text = i.ToString();
timer1.Interval = 1000;
timer1.Enabled = true;
timer1.Start();
}
private void Timer1_Tick(object sender, EventArgs e)
{
label1.Text = (--i).ToString();
if (i < 0)
timer1.Stop();
}
-
Вопрос задан
-
5529 просмотров
int i;
int tk;
string c;
private void Button1_Click(object sender, EventArgs e)
{
i = 300;
c ="5:00";
label1.Text = c;
timer1.Interval = 1000;
timer1.Enabled = true;
timer1.Start();
}
private void Timer1_Tick(object sender, EventArgs e)
{
tk = --i;
TimeSpan span = TimeSpan.FromMinutes(tk);
string label = span.ToString(@"hh\:mm");
label1.Text = label.ToString();
if (i < 0)
timer1.Stop();
}
1. Берем текущее время и прибавляем к нему 5 минут и сохраняем в переменную.
2. Включаем таймер с интервалом в 1/2 секунды, чтобы уменьшить лаг.
3. При каждом срабатывании таймера, берем текущее время и вычитаем его из сохраненной переменной. Получившееся значение типа TimeSpan выводим в label с нужным форматированием.
4. Если текущее время больше сохраненного в переменной вырубаем таймер, так как достигли результата.
Пригласить эксперта
Войдите, чтобы написать ответ
-
Показать ещё
Загружается…