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

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

  • автор:

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

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

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

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

// Запуск или останов секундомера. private DateTime StartTime; private void btnStart_Click(object sender, EventArgs e)

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

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

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

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

// Показывает новое прошедшее время. private void tmrClock_Tick(object sender, EventArgs e) < TimeSpan elapsed = DateTime.Now - StartTime; // Начнем с дней, если больше 0. string text = ""; if (elapsed.Days >0) text += elapsed.Days.ToString() + "."; // Преобразование миллисекунд в десятые доли секунды. int tenths = elapsed.Milliseconds / 100; // Запишите оставшееся время. text += elapsed.Hours.ToString("00") + ":" + elapsed.Minutes.ToString("00") + ":" + elapsed.Seconds.ToString("00") + "." + tenths.ToString("0"); lblElapsed.Text = text; >

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

Истекшая переменная 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.

Другой подход доступен в Visual Studio 2010 и более поздних версиях. В более ранних версиях метод TimeSpan класса TimeSpan не принимает никаких параметров и просто дает результат, аналогичный 1.02: 03: 04.0050000. В Visual Studio 2010 и более поздних версиях метод ToString может принимать строку форматирования. Строки стандартного формата отображают миллисекунды не менее 3-х цифр. Вы можете использовать строку пользовательского формата, например ts.ToString (@ «dd \: hh \: mm \: ss \ .f»), но тогда результат не распознается локалью. Если вам нужен секундомер для запуска в других странах, вам нужно будет определить страну и соответствующим образом скорректировать формат. По крайней мере, ToString (), а стандартные форматы, такие как ToString («g»), являются языковыми, поэтому вам не нужно беспокоиться о стране.

Пишем Секундомер

Привет. необходимо сделать такую штуку.
По нажатию клавиши старт должен включиться секундомер( который показывает минуты и секунды MM:SS)
И по нажатию на клавишу стоп остановиться.
Как такое сделать? заранее спасибо

Добавлено через 34 минуты
P.S. и это должно отображатьса в лейбле к примеру. чтобы человек видел сколько время уже прошло

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

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

Секундомер на C#
Здравствуйте. Можете кинуть список разделов, где уже поднимался данный вопрос.

Секундомер
Привет всем, делаю программу, которая засекает время (секудомер) , но почему-то, когда минуты.

Секундомер на форме
Здравствуйте! Хочу сделать секундомер на C# формах, не могу понять как сделать?

2364 / 1242 / 78
Регистрация: 28.10.2009
Сообщений: 4,331

Лучший ответ

Сообщение было отмечено как решение

Решение

Mr_Ser_Win, в принципе задача не сложная, хотя я не знаток си шарпа, возможно, можно как то проще сделать, думаю тут все понятно.

1 2 3 4 5 6 7 8 9 10 11 12 13 14
DateTime date1 = new DateTime(0, 0); private void timer1_Tick(object sender, EventArgs e) { date1 = date1.AddSeconds(1); label1.Text = date1.ToString("mm:ss"); } private void button1_Click(object sender, EventArgs e) { if (timer1.Enabled == true) timer1.Enabled = false; else timer1.Enabled = true; }

Регистрация: 15.10.2008
Сообщений: 320

AlexDios, тот код что ты дал, он при старте показывает 1 сек и все. отсчет дальше не идет

Добавлено через 42 минуты
все отлично работает. спасибо

2364 / 1242 / 78
Регистрация: 28.10.2009
Сообщений: 4,331

Немного модифицировал код, чтобы начинал подсчет с миллисекунд как в обычных таймерах — для этого надо в предыдущем примере поменять код для таймера и установить интервал таймера равным единице

1 2 3 4 5
private void timer1_Tick(object sender, EventArgs e) { date1 = date1.AddMilliseconds(1); label1.Text = date1.ToString("mm:ss:fff"); }

Регистрация: 15.10.2008
Сообщений: 320

ЦитатаСообщение от AlexDios Посмотреть сообщение

поменять код для таймера и установить интервал таймера равным единице
не совсем понял это
2364 / 1242 / 78
Регистрация: 28.10.2009
Сообщений: 4,331

Mr_Ser_Win, ну то есть в свойствах таймера установить свойство Interval=1 — для миллисекунд, а для секунд он устанавливается равным 1000.
Хотя ИМХО таймер в NET идет медленнее чем часы на локальном компе

Регистрация: 15.10.2008
Сообщений: 320
AlexDios, как то с секундами он у меня лучше работал.
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
Добрый день, подскажите пожалуйста, что такое — timer1 ?
911 / 815 / 332
Регистрация: 03.02.2015
Сообщений: 5,253
Записей в блоге: 9

ЦитатаСообщение от Jman Посмотреть сообщение

Добрый день, подскажите пожалуйста, что такое — timer1 ?
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Спасибо! Я думал это класс Time and Date, a это класс Timer; А как сделать вывод на форму? При помощи Label?

Добавлено через 32 минуты
Как вывести этот таймер на форму, ребят подскажите пожалуйста.

911 / 815 / 332
Регистрация: 03.02.2015
Сообщений: 5,253
Записей в блоге: 9

ЦитатаСообщение от Jman Посмотреть сообщение

Как вывести этот таймер на форму, ребят подскажите пожалуйста.

Перетаскиваешь и все (в дизайнере) ну или ручками:

1 2 3
Timer tmr = new Timer(); tmr .Interval = 1000; // Интервал в милисекундах tmr .Start();

89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

ЦитатаСообщение от Sanya_sa Посмотреть сообщение

Перетаскиваешь
В форме нужно взять элемент Label? Какое событие нужно вызвать?
911 / 815 / 332
Регистрация: 03.02.2015
Сообщений: 5,253
Записей в блоге: 9

ЦитатаСообщение от Jman Посмотреть сообщение

В форме нужно взять элемент Label? Какое событие нужно вызвать?
. Что хотите ? Событие тика таймера?
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Есть кнопка, нажимаю кнопку тикает таймер в окошке mm:ss;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
private void timer1_Tick(object sender, EventArgs e) { DateTime date1 = new DateTime(0, 0); date1 = date1.AddSeconds(1); label1.Text = date1.ToString("mm:ss"); } private void button1_Click(object sender, EventArgs e) { Timer timer1 = new Timer(); if (timer1.Enabled == true) timer1.Enabled = false; else timer1.Enabled = true; }

911 / 815 / 332
Регистрация: 03.02.2015
Сообщений: 5,253
Записей в блоге: 9

1 2 3 4 5 6 7 8 9
private void timer1_Tick(object sender, EventArgs e) { label1.Text = DateTime.Now.ToString(); } private void button1_Click(object sender, EventArgs e) { timer1.Enabled = timer1.Enabled ? false : true ; }

911 / 815 / 332
Регистрация: 03.02.2015
Сообщений: 5,253
Записей в блоге: 9

Вот нашел тут у себя что то:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace Stopwatch  public partial class MainForm : Form { private Font FntTW = new Font("Arial", 84); int ValueStopwatch = 0; int Calc = 0; bool Flash = false; public MainForm() { InitializeComponent(); SetStyle(ControlStyles.AllPaintingInWmPaint  // void Start() { timerSec.Enabled = true; buttonStop.Text = "STOP"; Invalidate(); } // void Stop() { if (timerSec.Enabled) { buttonStop.Text = "RESET"; } else { ValueStopwatch = 0; buttonStop.Text = "STOP"; } timerSec.Enabled = false; Invalidate(); } // void Tick() { Flash = Flash ? false : true; if (Calc == 2) { ValueStopwatch++; } Calc = Calc >= 2 ? 0 : Calc += 1; if (ValueStopwatch == 60) { MessageBox.Show("Прощла минута!"); } Invalidate(); } // private void buttonStart_Click(object sender, EventArgs e) { Start(); } // private void buttonStop_Click(object sender, EventArgs e) { Stop(); } // private void timerSec_Tick(object sender, EventArgs e) { Tick(); } // protected override void OnPaint(PaintEventArgs e) { e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; string s = Flash ? " " : " : "; e.Graphics.DrawString(string.Format(s, ValueStopwatch / 60, ValueStopwatch % 60), FntTW, Brushes.WhiteSmoke, new PointF()); } } }

Как вывести значения Timer в Label

Есть у меня игра «Найди пару». Добавил таймер на форму и хочу выводить это время в label. Типо: «00:01», «00:02», . «01:01», «01:02». Только начинаю работать с Windows Forms.

 private void TimeTick(object sender, EventArgs e)

введите сюда описание изображения

Такой код выводит [System. че то там] Подскажите, что делаю не так?

Отслеживать
задан 8 мая 2021 в 9:00
143 8 8 бронзовых знаков
Что такое timer2 ? Какую задачу вы решаете?
8 мая 2021 в 9:06

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

8 мая 2021 в 9:12

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Таймер служит для вызова обработчика события с определенным интервалом, он не подходит для измерения времени. Попробуйте Stopwatch в дополнение к таймеру.

private readonly Stopwatch stopwatch = new Stopwatch(); private void button1_click(object sender, EventArgs e) < stopwatch.Start(); // запустить секундомер // stopwatch.Stop(); // остановить секундомер // stopwatch.Restart(); // перезапустить секундомер с нуля // stopwatch.Reset(); // остановить и сбросить >private void TimeTick(object sender, EventArgs e)

То есть секундомер считает время, а Timer занимается обновлением значения этого времени на экране.

Есть еще вот такое решение для продвинутых разработчиков, там секунды можно хоть вручную без секундомера считать.

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

Регистрация: 18.11.2013

Сообщений: 2

C# Секундомер

Доброго времени суток! Помогите доделать секундомер: нужен циферблат(обозначение от 1 до 60),линия секундомера должна выглядеть как стрелка,а не линия(мой пример).
Вот мой секундомер:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace _13 < using System.Drawing.Drawing2D; public partial class Form1 : Form < public Form1() < InitializeComponent(); >private void Form1_Load(object sender, EventArgs e) < >public int angle = 0; public int num = 0; private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) < GraphicsPath myGraphicsPath = new GraphicsPath(); myGraphicsPath.AddString(num.ToString(), FontFamily.GenericMonospace, (int)FontStyle.Italic, 21f, new Point(20, 20), StringFormat.GenericDefault); myGraphicsPath.AddLine(100, 0, 100, 100); Matrix myMatrix = new Matrix(); PointF myPointF = new PointF(100,100); myMatrix.RotateAt(angle, myPointF); myGraphicsPath.Transform(myMatrix); e.Graphics.DrawPath(new Pen(Color.Black, 3), myGraphicsPath); angle = angle + 6; num = (int)angle / 6; if (angle == 360) angle = 0; e.Graphics.DrawEllipse(new Pen(Color.Blue, 2), 0, 0, 200, 200); e.Graphics.DrawLine(new Pen(Color.Red, 1), 0, 100, 200, 100); e.Graphics.DrawLine(new Pen(Color.Red, 1),100,0,100,200); >private void timer1_Tick(object sender, EventArgs e) < panel1.Refresh(); >> >

___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Последний раз редактировалось Serge_Bliznykov; 18.11.2013 в 16:41 .

NikolyaShiryaev
Посмотреть профиль
Найти ещё сообщения от NikolyaShiryaev

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *