Перейти к содержимому

Как сделать таймер в c windows forms

  • автор:

Timer Класс

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Реализует таймер, который вызывает событие через определенные пользователем интервалы времени. Данный таймер оптимизирован для приложений формы Windows Forms и должен использоваться в окне.

public ref class Timer : System::ComponentModel::Component
public class Timer : System.ComponentModel.Component
type Timer = class inherit Component
Public Class Timer Inherits Component

Наследование

Примеры

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

public ref class Class1 < private: static System::Windows::Forms::Timer^ myTimer = gcnew System::Windows::Forms::Timer; static int alarmCounter = 1; static bool exitFlag = false; // This is the method to run when the timer is raised. static void TimerEventProcessor( Object^ /*myObject*/, EventArgs^ /*myEventArgs*/ ) < myTimer->Stop(); // Displays a message box asking whether to continue running the timer. if ( MessageBox::Show( "Continue running?", String::Format( "Count is: ", alarmCounter ), MessageBoxButtons::YesNo ) == DialogResult::Yes ) < // Restarts the timer and increments the counter. alarmCounter += 1; myTimer->Enabled = true; > else < // Stops the timer. exitFlag = true; >> public: static void Main() < /* Adds the event and the event handler for the method that will process the timer event to the timer. */ myTimer->Tick += gcnew EventHandler( TimerEventProcessor ); // Sets the timer interval to 5 seconds. myTimer->Interval = 5000; myTimer->Start(); // Runs the timer, and raises the event. while ( exitFlag == false ) < // Processes all the events in the queue. Application::DoEvents(); >> >; int main()
public class Class1 < static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer(); static int alarmCounter = 1; static bool exitFlag = false; // This is the method to run when the timer is raised. private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs) < myTimer.Stop(); // Displays a message box asking whether to continue running the timer. if(MessageBox.Show("Continue running?", "Count is: " + alarmCounter, MessageBoxButtons.YesNo) == DialogResult.Yes) < // Restarts the timer and increments the counter. alarmCounter +=1; myTimer.Enabled = true; >else < // Stops the timer. exitFlag = true; >> public static int Main() < /* Adds the event and the event handler for the method that will process the timer event to the timer. */ myTimer.Tick += new EventHandler(TimerEventProcessor); // Sets the timer interval to 5 seconds. myTimer.Interval = 5000; myTimer.Start(); // Runs the timer, and raises the event. while(exitFlag == false) < // Processes all the events in the queue. Application.DoEvents(); >return 0; > > 
Public Class Class1 Private Shared WithEvents myTimer As New System.Windows.Forms.Timer() Private Shared alarmCounter As Integer = 1 Private Shared exitFlag As Boolean = False ' This is the method to run when the timer is raised. Private Shared Sub TimerEventProcessor(myObject As Object, _ ByVal myEventArgs As EventArgs) _ Handles myTimer.Tick myTimer.Stop() ' Displays a message box asking whether to continue running the timer. If MessageBox.Show("Continue running?", "Count is: " & alarmCounter, _ MessageBoxButtons.YesNo) = DialogResult.Yes Then ' Restarts the timer and increments the counter. alarmCounter += 1 myTimer.Enabled = True Else ' Stops the timer. exitFlag = True End If End Sub Public Shared Sub Main() ' Adds the event and the event handler for the method that will ' process the timer event to the timer. ' Sets the timer interval to 5 seconds. myTimer.Interval = 5000 myTimer.Start() ' Runs the timer, and raises the event. While exitFlag = False ' Processes all the events in the queue. Application.DoEvents() End While End Sub End Class 

Комментарии

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

При использовании этого таймера используйте Tick событие для выполнения операции опроса или отображения экрана-заставки в течение указанного периода времени. Всякий раз, когда свойству Enabled присвоено значение true , а Interval свойство больше нуля, Tick событие вызывается с интервалами в зависимости от Interval значения свойства.

Этот класс предоставляет методы для задания интервала, а также для запуска и остановки таймера.

Компонент таймера Windows Forms является однопоточным и ограничен точностью 55 миллисекунд. Если требуется многопоточный таймер с большей точностью, используйте Timer класс в System.Timers пространстве имен.

Конструкторы

Инициализирует новый экземпляр класса Timer.

Инициализирует новый экземпляр класса Timer вместе с указанным контейнером.

Свойства

Возвращает значение, показывающее, может ли компонент вызывать событие.

Возвращает объект IContainer, который содержит коллекцию Component.

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

Возвращает или задает признак активности таймера.

Возвращает список обработчиков событий, которые прикреплены к этому объекту Component.

Возвращает или задает время в миллисекундах до вызова события Tick относительно момента, когда событие Tick произошло последний раз.

Получает или задает ISite объекта Component.

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

Методы

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

Освобождает все ресурсы, занятые модулем Component.

Освобождает все используемые таймером ресурсы, кроме памяти.

Определяет, равен ли указанный объект текущему объекту.

Служит хэш-функцией по умолчанию.

Является устаревшей.

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

Возвращает объект, представляющий службу, предоставляемую классом Component или классом Container.

Возвращает объект Type для текущего экземпляра.

Является устаревшей.

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

Создает неполную копию текущего объекта Object.

Создает неполную копию текущего объекта MarshalByRefObject.

Возвращает строку, представляющую объект Timer.

События

Возникает при удалении компонента путем вызова метода Dispose().

Происходит по истечении заданного интервала таймера при условии, что таймер включен.

Как сделать таймер в c windows forms

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

Элемент TrackBar в Windows Forms

Некоторые важные свойства 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("Текущее значение: ", trackBar1.Value); > >

Перемещение ползунка в Windows Forms

Timer

Timer является компонентом для запуска действий, повторяющихся через определенный промежуток времени. Хотя он не является визуальным элементом, но его аткже можно перетащить с Панели Инструментов на форму:

Timer в Windows Forms

Наиболее важные свойства и методы таймера:

  • Свойство 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 в Windows Forms

Наиболее важые свойства 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(); >>

Как сделать таймер в Windows Forms?

petermzg

1. Берем текущее время и прибавляем к нему 5 минут и сохраняем в переменную.
2. Включаем таймер с интервалом в 1/2 секунды, чтобы уменьшить лаг.
3. При каждом срабатывании таймера, берем текущее время и вычитаем его из сохраненной переменной. Получившееся значение типа TimeSpan выводим в label с нужным форматированием.
4. Если текущее время больше сохраненного в переменной вырубаем таймер, так как достигли результата.

Ответ написан более трёх лет назад

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

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

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

В тесте используется элемент управления 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. Запустите еще один тест и предоставьте правильные ответы на арифметические примеры. При правильном ответе в течение отведенного времени откроется окно сообщения, кнопка запуска станет доступной, а таймер остановится.

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

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

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

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