Как создать таймер в c
Перейти к содержимому

Как создать таймер в c

  • автор:

Руководство. Добавление таймера в приложение WinForms для математики

В этой серии из четырех учебников вы создадите математический тест. Тест содержит четыре случайных арифметических примера, которые игрок должен решить в течение определенного времени.

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

В этом третьем учебнике вы научитесь следующему:

  • Добавление элемента управления Timer.
  • Добавление обработчика событий для таймера.
  • Написание кода для проверки ответов игрока, вывода сообщений и указания правильных ответов.

Необходимые компоненты

Этот учебник построен на предыдущих, начиная с учебника Создание приложения WinForms с математическим тестом. Если вы не изучили эти учебники, начните с них.

Добавление таймера с обратным отсчетом

Для наблюдения за временем в ходе теста используется компонент «Таймер». Кроме того, требуется переменная для хранения оставшегося времени.

    Добавьте целочисленную переменную с именем timeLeft так же, как вы объявляли переменные в предыдущих учебниках. Разместите объявление timeLeft сразу после других объявлений. Код должен выглядеть так, как показано ниже.

public partial class Form1 : Form < // Create a Random object called randomizer // to generate random numbers. Random randomizer = new Random(); // These integer variables store the numbers // for the addition problem. int addend1; int addend2; // These integer variables store the numbers // for the subtraction problem. int minuend; int subtrahend; // These integer variables store the numbers // for the multiplication problem. int multiplicand; int multiplier; // These integer variables store the numbers // for the division problem. int dividend; int divisor; // This integer variable keeps track of the // remaining time. int timeLeft; 
Public Class Form1 ' Create a Random object called randomizer ' to generate random numbers. Private randomizer As New Random ' These integer variables store the numbers ' for the addition problem. Private addend1 As Integer Private addend2 As Integer ' These integer variables store the numbers ' for the subtraction problem. Private minuend As Integer Private subtrahend As Integer ' These integer variables store the numbers ' for the multiplication problem. Private multiplicand As Integer Private multiplier As Integer ' These integer variables store the numbers ' for the division problem. Private dividend As Integer Private divisor As Integer ' This integer variable keeps track of the ' remaining time. Private timeLeft As Integer 

Используйте элемент управления языка программирования в правом верхнем углу этой страницы, чтобы просмотреть фрагмент кода на C# или Visual Basic.

Programming language control for Microsoft Learn

  1. В конструкторе Windows Forms переместите элемент управления Timer из категории Компоненты на панели элементов в форму. Элемент управления появляется в серой области в нижней части окна конструктора.
  2. Щелкните в форме только что добавленный значок timer1 и установите его свойство Interval равным 1000. Поскольку этот интервал измеряется в миллисекундах, при значении 1000 таймер создает событие Tick каждую секунду.

Проверка ответов

Поскольку таймер создает событие Tick каждую секунду, имеет смысл проверять истекшее время в обработчике событий Tick. Также целесообразно проверять ответы в этом обработчике событий. Если время истекло или ответы указаны правильно, тест должен завершиться.

Перед написанием этого обработчика событий добавьте метод CheckTheAnswer() , чтобы определить, верны ли ответы на арифметические примеры. Этот метод должен располагаться в строке с другими методами, например StartTheQuiz() . Код должен выглядеть так, как показано ниже.

/// /// Check the answers to see if the user got everything right. /// /// True if the answer's correct, false otherwise. private bool CheckTheAnswer() < if ((addend1 + addend2 == sum.Value) && (minuend - subtrahend == difference.Value) && (multiplicand * multiplier == product.Value) && (dividend / divisor == quotient.Value)) return true; else return false; >
''' ''' Check the answers to see if the user got everything right. ''' ''' True if the answer's correct, false otherwise. ''' Public Function CheckTheAnswer() As Boolean If addend1 + addend2 = sum.Value AndAlso minuend - subtrahend = difference.Value AndAlso multiplicand * multiplier = product.Value AndAlso dividend / divisor = quotient.Value Then Return True Else Return False End If End Function 

Этот метод определяет ответы на арифметические примеры и сравнивает результаты со значениями в элементах управления NumericUpDown. В этом коде:

  • Версия на Visual Basic использует ключевое слово Function вместо обычного ключевого слова Sub , потому что этот метод возвращает значение.
  • Так как простого способа ввести знак умножения (×) и знак деления (÷) с клавиатуры нет, в языках C# и Visual Basic используется звездочка (*) для умножения и косая черта (/) для деления.
  • В C# && — это оператор logical and . Эквивалентный оператор в языке Visual Basic — AndAlso . Оператор logical and используется для проверки того, имеет ли значение true более одного условия. В этом случае, если все значения верны, метод возвращает значение true . В противном случае метод возвращает значение false .
  • Инструкция if использует свойство Value элемента управления NumericUpDown для доступа к текущему значению элемента управления. В следующем разделе вы используете то же свойство для вывода правильного ответа в каждом элементе управления.

Добавление обработчика событий в таймер

Теперь, когда у вас есть способ проверить ответы, можно написать код для обработчика событий Tick. Этот код выполняется каждую секунду после того, как таймер создаст событие Tick. Этот обработчик событий проверяет ответы игрока, вызывая метод CheckTheAnswer() . Он также проверяет, сколько времени теста уже истекло.

    Двойным щелчком выберите в форме элемент управления Timer либо выделите его и нажмите клавишу ВВОД. Эти действия добавляют обработчик событий Tick к таймеру. Откроется редактор кода, в котором отобразится метод обработчика Tick.

Добавьте в новый метод обработчика событий следующие операторы.

private void timer1_Tick(object sender, EventArgs e) < if (CheckTheAnswer()) < // If CheckTheAnswer() returns true, then the user // got the answer right. Stop the timer // and show a MessageBox. timer1.Stop(); MessageBox.Show("You got all the answers right!", "Congratulations!"); startButton.Enabled = true; >else if (timeLeft > 0) < // If CheckTheAnswer() returns false, keep counting // down. Decrease the time left by one second and // display the new time left by updating the // Time Left label. timeLeft = timeLeft - 1; timeLabel.Text = timeLeft + " seconds"; >else < // If the user ran out of time, stop the timer, show // a MessageBox, and fill in the answers. timer1.Stop(); timeLabel.Text = "Time's up!"; MessageBox.Show("You didn't finish in time.", "Sorry!"); sum.Value = addend1 + addend2; difference.Value = minuend - subtrahend; product.Value = multiplicand * multiplier; quotient.Value = dividend / divisor; startButton.Enabled = true; >> 
Private Sub Timer1_Tick() Handles Timer1.Tick If CheckTheAnswer() Then ' If CheckTheAnswer() returns true, then the user ' got the answer right. Stop the timer ' and show a MessageBox. Timer1.Stop() MessageBox.Show("You got all of the answers right!", "Congratulations!") startButton.Enabled = True ElseIf timeLeft > 0 Then ' If CheckTheAnswer() returns false, keep counting ' down. Decrease the time left by one second and ' display the new time left by updating the ' Time Left label. timeLeft -= 1 timeLabel.Text = timeLeft & " seconds" Else ' If the user ran out of time, stop the timer, show ' a MessageBox, and fill in the answers. Timer1.Stop() timeLabel.Text = "Time's up!" MessageBox.Show("You didn't finish in time.", "Sorry!") sum.Value = addend1 + addend2 difference.Value = minuend - subtrahend product.Value = multiplicand * multiplier quotient.Value = dividend / divisor startButton.Enabled = True End If End Sub 

Этот метод выполняется каждую секунду теста. Код сначала проверяет значение, которое возвращает CheckTheAnswer() .

  • Если все ответы верны, это значение равно true , и тест завершается:
    • Таймер останавливается.
    • Появится поздравительное сообщение.
    • Свойству Enabled элемента управления startButton устанавливается значение true , чтобы игрок мог заново запустить тест.
    • Если эта переменная больше 0, таймер вычитает 1 из timeLeft. Затем он обновляет свойство Text элемента управления timeLabel, чтобы показать игроку, сколько осталось секунд.
    • Если времени не остается, таймер останавливается и изменяет текст timeLabel на time's up! В окне сообщения будет объявлено, что тест закончен, и появятся ответы. Кнопка старта снова станет доступной.

    Запуск таймера

    Чтобы запустить таймер при запуске теста, добавьте в конец метода StartTheQuiz() три строки, как показано в следующем примере.

    /// /// Start the quiz by filling in all of the problem /// values and starting the timer. /// public void StartTheQuiz() < // Fill in the addition problem. // Generate two random numbers to add. // Store the values in the variables 'addend1' and 'addend2'. addend1 = randomizer.Next(51); addend2 = randomizer.Next(51); // Convert the two randomly generated numbers // into strings so that they can be displayed // in the label controls. plusLeftLabel.Text = addend1.ToString(); plusRightLabel.Text = addend2.ToString(); // 'sum' is the name of the NumericUpDown control. // This step makes sure its value is zero before // adding any values to it. sum.Value = 0; // Fill in the subtraction problem. minuend = randomizer.Next(1, 101); subtrahend = randomizer.Next(1, minuend); minusLeftLabel.Text = minuend.ToString(); minusRightLabel.Text = subtrahend.ToString(); difference.Value = 0; // Fill in the multiplication problem. multiplicand = randomizer.Next(2, 11); multiplier = randomizer.Next(2, 11); timesLeftLabel.Text = multiplicand.ToString(); timesRightLabel.Text = multiplier.ToString(); product.Value = 0; // Fill in the division problem. divisor = randomizer.Next(2, 11); int temporaryQuotient = randomizer.Next(2, 11); dividend = divisor * temporaryQuotient; dividedLeftLabel.Text = dividend.ToString(); dividedRightLabel.Text = divisor.ToString(); quotient.Value = 0; // Start the timer. timeLeft = 30; timeLabel.Text = "30 seconds"; timer1.Start(); >
    ''' ''' Start the quiz by filling in all of the problem ''' values and starting the timer. ''' ''' Public Sub StartTheQuiz() ' Fill in the addition problem. ' Generate two random numbers to add. ' Store the values in the variables 'addend1' and 'addend2'. addend1 = randomizer.Next(51) addend2 = randomizer.Next(51) ' Convert the two randomly generated numbers ' into strings so that they can be displayed ' in the label controls. plusLeftLabel.Text = addend1.ToString() plusRightLabel.Text = addend2.ToString() ' 'sum' is the name of the NumericUpDown control. ' This step makes sure its value is zero before ' adding any values to it. sum.Value = 0 ' Fill in the subtraction problem. minuend = randomizer.Next(1, 101) subtrahend = randomizer.Next(1, minuend) minusLeftLabel.Text = minuend.ToString() minusRightLabel.Text = subtrahend.ToString() difference.Value = 0 ' Fill in the multiplication problem. multiplicand = randomizer.Next(2, 11) multiplier = randomizer.Next(2, 11) timesLeftLabel.Text = multiplicand.ToString() timesRightLabel.Text = multiplier.ToString() product.Value = 0 ' Fill in the division problem. divisor = randomizer.Next(2, 11) Dim temporaryQuotient As Integer = randomizer.Next(2, 11) dividend = divisor * temporaryQuotient dividedLeftLabel.Text = dividend.ToString() dividedRightLabel.Text = divisor.ToString() quotient.Value = 0 ' Start the timer. timeLeft = 30 timeLabel.Text = "30 seconds" Timer1.Start() End Sub 

    Теперь при запуске теста переменная timeLeft устанавливается в значение 30, а свойство Text элемента управления timeLabel — 30 секунд. После этого метод Start() элемента управления Timer начинает обратный отсчет.

    Запустите приложение.

    Screenshot that shows a completed quiz with 19 seconds remaining. The Start the quiz button is available.

    1. Сохраните и выполните программу.
    2. Нажмите Начать тест. Таймер начинает обратный отсчет. Когда время истечет, тест закончится и появятся ответы.
    3. Запустите еще один тест и предоставьте правильные ответы на арифметические примеры. При правильном ответе в течение отведенного времени откроется окно сообщения, кнопка запуска станет доступной, а таймер остановится.

    Следующие шаги

    Перейдите к следующему учебнику, чтобы узнать, как настроить математический тест.

    Использование таймеров

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

    В этом разделе содержатся следующие подразделы.

    • Создание таймера
    • Уничтожение таймера
    • Использование функций таймера для перехвата входных данных с помощью мыши
    • Связанные темы

    Создание таймера

    В следующем примере функция SetTimer используется для создания двух таймеров. Первый таймер устанавливается каждые 10 секунд, второй — каждые пять минут.

    // Set two timers. SetTimer(hwnd, // handle to main window IDT_TIMER1, // timer identifier 10000, // 10-second interval (TIMERPROC) NULL); // no timer callback SetTimer(hwnd, // handle to main window IDT_TIMER2, // timer identifier 300000, // five-minute interval (TIMERPROC) NULL); // no timer callback 

    Чтобы обработать сообщения WM_TIMER , созданные этими таймерами, добавьте оператор WM_TIMER case в процедуру window для параметра hwnd .

    case WM_TIMER: switch (wParam) < case IDT_TIMER1: // process the 10-second timer return 0; case IDT_TIMER2: // process the five-minute timer return 0; >

    Приложение также может создать таймер, WM_TIMER сообщения которого обрабатываются не процедурой main окна, а определенной приложением функцией обратного вызова, как показано в следующем примере кода, который создает таймер и использует функцию обратного вызова MyTimerProc для обработки сообщений WM_TIMER таймера.

    // Set the timer. SetTimer(hwnd, // handle to main window IDT_TIMER3, // timer identifier 5000, // 5-second interval (TIMERPROC) MyTimerProc); // timer callback 

    Соглашение о вызовах для MyTimerProc должно основываться на функции обратного вызова TimerProc .

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

    HWND hwndTimer; // handle to window for timer messages MSG msg; // message structure while (GetMessage(&msg, // message structure NULL, // handle to window to receive the message 0, // lowest message to examine 0)) // highest message to examine < // Post WM_TIMER messages to the hwndTimer procedure. if (msg.message == WM_TIMER) < msg.hwnd = hwndTimer; >TranslateMessage(&msg); // translates virtual-key codes DispatchMessage(&msg); // dispatches message to window > 

    Уничтожение таймера

    Приложения должны использовать функцию KillTimer для уничтожения таймеров, которые больше не нужны. В следующем примере удаляются таймеры, определяемые константами IDT_TIMER1, IDT_TIMER2 и IDT_TIMER3.

    // Destroy the timers. KillTimer(hwnd, IDT_TIMER1); KillTimer(hwnd, IDT_TIMER2); KillTimer(hwnd, IDT_TIMER3); 

    Использование функций таймера для перехвата входных данных с помощью мыши

    Иногда при наличии указателя мыши на экране необходимо запретить дополнительный ввод. Один из способов сделать это — создать специальную подпрограмму, которая перехватывает ввод с помощью мыши до тех пор, пока не произойдет определенное событие. Многие разработчики называют эту процедуру "построением мышеловки".

    В следующем примере используются функции SetTimer и KillTimer для перехвата входных данных с помощью мыши. SetTimer создает таймер, который отправляет WM_TIMER сообщение каждые 10 секунд. Каждый раз, когда приложение получает WM_TIMER сообщение, оно записывает расположение указателя мыши. Если текущее расположение совпадает с предыдущим расположением и окно main приложения свернуто, приложение перемещает указатель мыши на значок. Когда приложение закрывается, KillTimer останавливает таймер.

    HICON hIcon1; // icon handle POINT ptOld; // previous cursor location UINT uResult; // SetTimer's return value HINSTANCE hinstance; // handle to current instance // // Perform application initialization here. // wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400)); wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200)); // Record the initial cursor position. GetCursorPos(&ptOld); // Set the timer for the mousetrap. uResult = SetTimer(hwnd, // handle to main window IDT_MOUSETRAP, // timer identifier 10000, // 10-second interval (TIMERPROC) NULL); // no timer callback if (uResult == 0) < ErrorHandler("No timer is available."); >LONG APIENTRY MainWndProc( HWND hwnd, // handle to main window UINT message, // type of message WPARAM wParam, // additional information LPARAM lParam) // additional information < HDC hdc; // handle to device context POINT pt; // current cursor location RECT rc; // location of minimized window switch (message) < // // Process other messages. // case WM_TIMER: // If the window is minimized, compare the current // cursor position with the one from 10 seconds // earlier. If the cursor position has not changed, // move the cursor to the icon. if (IsIconic(hwnd)) < GetCursorPos(&pt); if ((pt.x == ptOld.x) && (pt.y == ptOld.y)) < GetWindowRect(hwnd, &rc); SetCursorPos(rc.left, rc.top); >else < ptOld.x = pt.x; ptOld.y = pt.y; >> return 0; case WM_DESTROY: // Destroy the timer. KillTimer(hwnd, IDT_MOUSETRAP); PostQuitMessage(0); break; // // Process other messages. // > 

    Хотя в следующем примере также показано, как перехватить ввод мыши, он обрабатывает сообщение WM_TIMER через определяемую приложением функцию обратного вызова MyTimerProc, а не через очередь сообщений приложения.

    UINT uResult; // SetTimer's return value HICON hIcon1; // icon handle POINT ptOld; // previous cursor location HINSTANCE hinstance; // handle to current instance // // Perform application initialization here. // wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400)); wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200)); // Record the current cursor position. GetCursorPos(&ptOld); // Set the timer for the mousetrap. uResult = SetTimer(hwnd, // handle to main window IDT_MOUSETRAP, // timer identifier 10000, // 10-second interval (TIMERPROC) MyTimerProc); // timer callback if (uResult == 0) < ErrorHandler("No timer is available."); >LONG APIENTRY MainWndProc( HWND hwnd, // handle to main window UINT message, // type of message WPARAM wParam, // additional information LPARAM lParam) // additional information < HDC hdc; // handle to device context switch (message) < // // Process other messages. // case WM_DESTROY: // Destroy the timer. KillTimer(hwnd, IDT_MOUSETRAP); PostQuitMessage(0); break; // // Process other messages. // >// MyTimerProc is an application-defined callback function that // processes WM_TIMER messages. VOID CALLBACK MyTimerProc( HWND hwnd, // handle to window for timer messages UINT message, // WM_TIMER message UINT idTimer, // timer identifier DWORD dwTime) // current system time < RECT rc; POINT pt; // If the window is minimized, compare the current // cursor position with the one from 10 seconds earlier. // If the cursor position has not changed, move the // cursor to the icon. if (IsIconic(hwnd)) < GetCursorPos(&pt); if ((pt.x == ptOld.x) && (pt.y == ptOld.y)) < GetWindowRect(hwnd, &rc); SetCursorPos(rc.left, rc.top); >else < ptOld.x = pt.x; ptOld.y = pt.y; >> > 

    Как работать с таймером в СИ?

    как правильно пользоваться таймером в CИ ? К примеру мне нужно подождать без "засыпания" 100 мс для последующей "работы", но при этом выполнять иные "задачи" пока жду завершения "поставленного" времени. К примеру можно использовать sleep(3) НО он "уводит" процесс в "засыпание" и я не могу выполнять иные задачи во время "этого" промежутка времени. этот вопрос создал в связи с тем что, в книгах столкнулся с малым количеством примеров работы с таймером, (книги новые, Язык си в XXI веке и Язык С Справочник(стандарт С11) )

    Отслеживать
    задан 17 окт 2019 в 13:06
    2,907 7 7 золотых знаков 44 44 серебряных знака 92 92 бронзовых знака

    Если не хотите углубляться в многопоточность, то можно попробовать сделать через setitimer() или timer_settime() . Можно и через alarm() , но там точность — секунда.

    17 окт 2019 в 14:40

    2 ответа 2

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

    мне нужно подождать 100 мс, но при этом выполнять иные задачи

    Это называется "мультипрограммирование". Или, по другому "параллельное программирование" потому, что несколько "потоков управления" (программ, подпрограмм. ) выполняются параллельно.

    Независимо от языка программирования и ОС, для оторой Вы пытаетесь написать программу, есть всего две методики организации мультипрограммирования:

    • Нити (треды - thread)
    • Процессы

    В разных ОС эти подходы реализуются чуть-чуть по разному. Если говорить о Linux, то:

    • Нити реализуются с помощью библиотеки pthread (см. http://ccfit.nsu.ru/arom/data/PP_ICaG/03_pthreads_txt.pdf)
    • Потоки создаются системным вызовом fork() (см. man 2 fork)

    В любом случае, параллельное программирование - тема очень сложная и ребует время для освоения. Подумайте - никак не обойтись?

    Как создать таймер в c

    Доброго времени суток! В этой статье я расскажу об использовании таймера в программах, написанных на C#, а в конце мы напишем простейшую программу часы. Статья будет практического характера и для её понимания Вам нужно владеть начальными знаниями программирования на языке C# и работы с WindowsForms приложениями. Но сначала, я расскажу для чего же нужны таймеры в программах. Чаще всего, таймеры используют для периодического вызова определенного метода (подпрограммы). У компонента «Timer» есть специальное (и единственное событие) — «Tick». Вот обработчик этого события, далее обработчик таймера, и вызывается с заданной программистом периодичностью.

    Как я уже сказал, рассказ о таймерах будет в контексте WindowsForms. Так что я предлагаю создать новый проект приложения с графическим интерфейсом (WindowsForms). После чего, на главную форму из панели инструментов перенести компонент «Timer». Расположение компонента «Timer» в панели инструментов показано на рисунке ниже.

    Компонент Timer

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

    Компонент Timer в дизайнере (под формой)

    Компонент Timer в дизайнере (под формой)

    И если выбрать данный компонент в дизайнере форм, то можно увидеть его свойства, которых не так много — всего шесть. Я расскажу о самых важных, которые мы будем использовать. А сейчас, давайте посмотрим на свойства таймера (см. рисунок ниже).

    Свойства компонента Timer

    Свойства компонента Timer

    • Свойство «Name» задает название таймера (скорее даже его уникальное имя, так как на форме может быть не один такой компонент);
    • Свойство «Eneble» делает таймер доступным (если установлено в true) или наоборот — недоступным (если установлено в false);
    • Свойство «Interavl» задает интервал, через который будет периодически вызываться обработчик таймера.

    Так же у компонента «Timer» есть два интересующих нас метода:

    • Start — запускает таймер (после вызова этого метода, будет периодически «срабатывать» обработчик таймера);
    • Stop — останавливает таймер (после вызова этого метода, обработчик таймера перестанет «срабатывать» ).

    А вот и то самое событие «Tick»:

    Событие (Tick) таймера

    Событие (Tick) таймера

    А теперь, давайте приступим к практике. Для наглядности, я решил написать программу часы. Конечно, полноценными часами эту программу назвать нельзя, но она будет показывать время. Причем, не всегда, а только когда мы запустим таймер, который будет «срабатывать» раз в секунду, и выводить текущее время в надпись на форме. Для запуска и остановки таймера будут использоваться две кнопки.

    После того как я перенес все необходимые элементы на главную форму, она стала выглядеть так, как показано на рисунке ниже.

    Главное окно программы

    Главное окно программы

    Как видите, программа максимально простая: две кнопки, да текстовая надпись. А теперь, давайте перейдем к коду. Я создал обработчики событий клика для каждой копки и события «Tick» таймера. Код приведен ниже:

    //Обработчик нажатия на кнопку "Старт" private void StartBtn_Click(object sender, EventArgs e) < //Делаем таймер доступным MainTimer.Enabled = true; //Запускаем таймер MainTimer.Start(); >//Обработчик нажатия на кнопку "Стоп" private void StopBtn_Click(object sender, EventArgs e) < //Останавливаем таймер MainTimer.Stop(); //Снова делаем таймер недоступным MainTimer.Enabled = false; //"Сбрасываем" текст надписи в исходное состояние TimeLbl.Text = "Текущее время:"; >//Обработчик таймера (вызывается с заданной периодичностью) private void MainTimer_Tick(object sender, EventArgs e) < //Раз в секунду будет выводиться такой текст (с текущим временем) TimeLbl.Text = string.Format("Текущее время: ", DateTime.Now.ToString("HH:mm:ss")); >

    Всё довольно просто! А вот так будет выглядеть запущенная программа после нажатия на кнопку «Старт».

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

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