Как сделать секундомер в c windows forms

от admin

Creating a simple Stopwatch/Timer application with C# and Windows Forms

While working on a project today, I came across the need for a simple stopwatch/timer which would keep track of the total elapsed time until it was reset. It turned out to be a little trickier than I first assumed, so I’ve posted my code here for the convenience of anyone else who needs to do the same thing.

Because I wasn’t interested in sub-second accuracy, I’ve used System.Windows.Forms.Timer for simplicity, but the principle is the same whichever timer class you use.

If you want to find out more about the differences between System.Threading.Timer , System.Windows.Forms.Timer and System.Timers.Timer , it’s definitely worth reading this article comparing the Timer classes in the .NET Framework class library.

Questions or comments? Get in touch @markeebee, or email [Turn On Javascript To View Email Address] .

Как сделать секундомер в C#

Эта программа представляет собой простой секундомер. Когда вы нажимаете кнопку «Пуск», программа меняет заголовок кнопки на «Стоп» и запускает Timer. По мере запуска секундомера Timer программа отображает прошедшее время. Нажмите кнопку «Стоп», чтобы остановить Timer.

Этот пример почти тривиален, но на самом деле возникает несколько интересных проблем.

В следующем коде показан обработчик события Click кнопки.

Этот код сначала переключает свойство Enable компонента Timer компонента, поэтому он запускается, если он остановлен и наоборот.

Далее код устанавливает свойство кнопки Text кнопки. Если Timer включен, тогда выполняется Timer, поэтому свойство Text кнопки должно быть «Стоп». Если Timer отключен, то Timer не работает, поэтому свойство Text кнопки должно быть «Start». (Обычно я не использую оператор?: потому что это сбив с толку, но в этом случае он сокращает код, и это то, что каждый программист на C# должен знать, как использовать, даже если вы его не используете.)

Наконец, этот код записывает текущее время в переменной StartTime.

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

Этот код получает прошедшее время, так как секундомер запускается путем вычитания времени начала с текущего времени.

Истекшая переменная TimeSpan имеет Days, Часы, Минуты, Секунды , и Milliseconds, чтобы узнать, сколько времени прошло. Каждое из этих значений не учитывает значения более высокого уровня. Например, если прошло 1 час и 10 минут, свойство Hour равно 1, а свойство Minutes равно 10. Свойство Minutes not 70 для представления всего прошедшего времени в минутах.

Класс TimeSpan также имеет TotalDays, TotalHours и аналогичные свойства для представления времени в одной единице. В этом примере TotalMinutes будет равным 70. Этот пример не использует свойства Total.

Если количество прошедших дней составляет не менее 1, код добавляет количество дней к переменной text.

Затем код преобразует число миллисекунд в десятые доли секунды. Это одно из мест, где этот пример немного сложнее. Выражение прошло. Миллисекунды / 100 обрезает результат. Например, если число миллисекунд равно 199, этот код обрезает результат на 1 десятую секунды.

Однако вы, вероятно, захотите округлить это до 2 десятых секунды. Вы можете сделать это с помощью дополнительного кода, но что произойдет, если число миллисекунд равно 999? Тогда вы обойдете это до 10 десятых секунды. Это означало бы, что вам нужно добавить еще 1 секунду к числу прошедших секунд. Но тогда, если количество прошедших секунд равно 59? Затем вам нужно будет добавить минута к количеству прошедших минут.

Вероятно, вы можете видеть, куда это направляется. Вам понадобятся специальные случаи, чтобы добавить дополнительные секунды, минуты, часы и дни. Обработка всех этих особых случаев делает код намного дольше и труднее читать и отлаживать. Этот секундомер просто обрезает число десятых. Результат может быть отключен на 0,05 секунды. Это всего лишь 1/20 секунды, и прошедшее время сокращается на эту сумму в течение небольшого промежутка времени, поэтому я хочу жить с ним, чтобы упростить код.

Фактически, вы можете сделать код секундомера еще проще, просто отображая значение elapsed.ToString (). К сожалению, это показывает прошедшее время в формате 1.02: 03: 04.0050000. Это дает необоснованное впечатление о точности времени.

Вы можете попытаться удалить конечные цифры, но тогда вы в основном усекаете миллисекунды. Вы можете попробовать округлить, но тогда у вас есть те же проблемы, что и раньше.

Чтобы сделать синтаксический анализ этого значения еще более сложным, время не соответствует согласованному формату. Например, оно не включает число дней этого числа равно 0. Оно также не включает миллисекунды, если они оказались равными 0.

How To Make a StopWatch With C#

I just want to ask that if I can make a stopwatch with C# I tried:

this but it didn’t worked. My timer is setted up and the interval of the timer is 1000ms. Can someone help me?

Visual Vincent's user avatar

1 Answer 1

It looks to me, that you are more likly to make a watch rather than a stopwatch?

If you’re making a stopwatch, I think you need a field/property in your class that holds the starting time:

and then in timer1_Tick you can do:

It seems that your current code in timer1_Tick only has local variables and therefore always will produce the same time? 🙂

Timer

Компонент Timer (рис. 3.31) генерирует последовательность событий Tick . Обычно он используется для активизации с заданным периодом некоторых действий. Компонент является невизуальным (во время работы программы в окне не отображается). Свойства компонента приведены в табл. 3.20.

Читать:
Как определить квартал по дате в excel

Таблица 3.20. Свойства компонента Timer

Период генерации события Tick . Задается в миллисекундах

Разрешение работы. Разрешает (значение True ) или запрещает (значение

False ) генерацию события Tick

Рис. 3.31. Компонент Timer

Рис. 3.32. Форма программы «Секундомер»

Программа «Секундомер» (ее форма приведена на рис. 3.32, а текст — в листинге 3.12) демонстрирует использование компонента Timer . Во время создания формы свойству Interval таймера надо присвоить значение 500. Кнопка button1 предназначена как для запуска секундомера, так и для его остановки. В начале работы программы значение свойства Enabled компонента Timer равно False , поэтому таймер не работает (не генерирует события Tick ). Процедура обработки

Глава 3. Базовые компоненты

события Click на кнопке button1 проверяет состояние таймера и, если он не работает, присваивает значение True свойству Enabled компонента Timer и тем самым запускает таймер. Процедура обработки события Tick инвертирует значение свойства Visible компонента label2 (в результате двоеточие мигает с периодом 0,5 секунд) и, если двоеточие скрыто, завершает свою работу. Если двоеточие отображается, то она увеличивает счетчик времени и выводит в поле компонентов label1 и label3 значения счетчиков минут и секунд (величину интервала с момента запуска секундомера). Если секундомер работает, то щелчок на кнопке Стоп ( button1 ) останавливает секундомер.

Листинг 3.12. Секундомер

// минуты, секунды, миллисекунды int m, s;

// настройка таймера: сигнал от таймера — каждые 0.5 секунды timer1.Interval = 500;

label1.Text = «00»; label2.Text = «00»; label3.Visible = true ;

// щелчок на кнопке Пуск/Стоп

private void button1_Click( object sender, EventArgs e)

// таймер работает, остановить таймер timer1.Enabled = false ;

// изменить текст на кнопке и сделать ее доступной button1.Text = «Пуск»;

// таймер не работает, запускаем таймер timer1.Enabled = true ;

Часть I. Microsoft Visual C# 2010

// изменить текст на кнопке и сделать ее недоступной button1.Text = «Стоп»;

// щелчок на кнопке Сброс

private void button2_Click( object sender, EventArgs e)

label1.Text = «00»; label2.Text = «00»;

// сигнал от таймера

private void timer1_Tick( object sender, EventArgs e)

// двоеточие мигает с периодом 0.5 сек if (label3.Visible)

label2.Text = «0» + s.ToString(); else

label1.Text = «0» + m.ToString(); else

label1.Text = m.ToString(); s = 0;

Глава 3. Базовые компоненты

NumericUpDown

Компонент NumericUpDown (рис. 3.33) предназначен для ввода числовых данных. Данные можно ввести в поле редактирования путем набора на клавиатуре или изменить уже введенные данные при помощи командных кнопок Увеличить и Уменьшить , которые находятся справа от поля редактирования.

Свойства компонента NumericUpDown приведены в табл. 3.21.

Рис. 3.33. Компонент NumericUpDown

Таблица 3.21. Свойства компонента NumericUpDown

Значение, соответствующее содержимому поля редактирования

Максимально возможное значение, которое можно ввести в поле компо-

Минимально возможное значение, которое можно ввести в поле компо-

Величина, на которую увеличивается или уменьшается значение свойст-

ва Value при каждом щелчке мышью на кнопках Увеличить или

Количество цифр дробной части числа

Часть I. Microsoft Visual C# 2010

Если в поле редактирования компонента NumericUpDown введено дробное число, то в результате нажатия клавиши <Enter> оно будет округлено до DecimalPlaces цифр дробной части. При этом если значение свойства DecimalPlaces равно нулю, то значение в поле компонента будет округлено до целого.

Программа «Таймер» (ее форма приведена на рис. 3.34, а текст — в листинге 3.13) демонстрирует использование компонента NumericUpDown .

Рис. 3.34. Форма программы «Таймер»

Компоненты numericUpDown1 и numericUpDown2 используются для ввода значения интервала времени. Во время создания формы свойству Maximum обоих компонентов надо присвоить значение 59.

Листинг 3.13. Таймер

private DateTime t1; // время запуска таймера private DateTime t2; // время срабатывания таймера

// Настройка компонентов numericUpDown numericUpDown1.Maximum = 59; numericUpDown1.Minimum = 0;

// Чтобы при появлении окна курсор не мигал в поле редактирования numericUpDown1.TabStop = false ;

numericUpDown2.Maximum = 59; numericUpDown2.Minimum = 0; numericUpDown2.TabStop = false ;

// Кнопка Пуск/Стоп недоступна button1.Enabled = false ;

Глава 3. Базовые компоненты

// Обрабатывает событие ValueChanged от компонентов

// numericUpDown1 и numericUpDown1

private void numericUpDown1_ValueChanged( object sender, EventArgs e)

if ((numericUpDown1.Value == 0) && (numericUpDown2.Value == 0)) button1.Enabled = false ;

// щелчок на кнопке Пуск/Стоп

private void button1_Click( object sender, EventArgs e)

// таймер не работает

// t1 — текущее время

// t2 = t1 + интервал

t1 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);

t2 = t1.AddMinutes(( double )numericUpDown1.Value);

t2 = t2.AddSeconds(( double )numericUpDown2.Value);

groupBox1.Enabled = false ; button1.Text = «Стоп»;

label1.Text = «0» + t2.Minute.ToString() + «:»; else

label1.Text += «0» + t2.Second.ToString(); else

// сигнал от таймера поступает каждую секунду timer1.Interval = 1000;

// таймер работает, останавливаем timer1.Enabled = false ;

Часть I. Microsoft Visual C# 2010

button1.Text = «Пуск»; groupBox1.Enabled = true ; numericUpDown1.Value = t2.Minute; numericUpDown2.Value = t2.Second;

// сигнал от таймера

private void timer1_Tick( object sender, EventArgs e)

label1.Text = «0» + t2.Minute.ToString() + «:»; else

label1.Text += «0» + t2.Second.ToString(); else

MessageBox.Show(«Заданный интервал времени истек», «Таймер»,

button1.Text = «Пуск»; groupBox1.Enabled = true ; numericUpDown1.Value = 0; numericUpDown2.Value = 0;

При изменении значения, находящегося в поле редактирования компонента NumericUpDown , возникает событие ValueChanged . Функция обработки этого события (одна для обоих компонентов) управляет доступностью кнопки Пуск . Она проверяет значения свойств Value и, если интервал не задан (равен нулю), делает кнопку недоступной. Процедура обработки события Click , возникающего при щелчке на кнопке button1 , запускает или, если таймер работает, останавливает таймер. При запуске таймера в переменную t1 записывается текущее время, а в переменную t2 — значение, сдвинутое вперед на величину интервала ( t2 = момент запуска + интервал). Процедура обработки события Tick таймера уменьшает на единицу значение t2 и, если оно становится равным t1 , останавливает таймер. Она же обеспе-

Похожие статьи