Я новичок в этом поле. Я использую таймер в своей форме Windows, который извлекает данные из базы данных через фиксированный интервал. Теперь я хочу, чтобы мой таймер повторял то же самое, но мне нужно, чтобы секундомер отображался каждую секунду на моем экране. Есть ли способ сделать это? код здесь …..
открытый частичный класс Form2: Form {private Timer _timer; int count = 0; //Время последнего запуска таймера private DateTime _startTime = DateTime.MinValue; //Время между текущим моментом и последним запуском таймера private TimeSpan _currentElapsedTime = TimeSpan.Zero; //Время между настоящим моментом и первым запуском таймера после сброса private TimeSpan _totalElapsedTime = TimeSpan.Zero; //Независимо от того, работает ли в данный момент таймер private bool _timerRunning = false; общедоступная форма2 (String UserName) {InitializeComponent (); _timer = новый таймер (); _timer.Interval = 1000; _timer.Tick + = новый обработчик событий (timer_Tick); label4.Text = Имя пользователя; } private void richTextBox2_TextChanged (отправитель объекта, EventArgs e) {} private void timer_Tick (отправитель объекта, EventArgs e) {count = count + 1; var timeSinceStartTime = DateTime.Now - _startTime; timeSinceStartTime = новый TimeSpan (timeSinceStartTime.Hours, timeSinceStartTime.Minutes, timeSinceStartTime.Seconds); //Текущее прошедшее время - это время с момента нажатия//кнопки пуска плюс общее время, прошедшее с момента последнего сброса _currentElapsedTime = timeSinceStartTime + _totalElapsedTime; //Это всего лишь два элемента управления Label, которые отображают текущее//прошедшее время и общее прошедшее время label3.Text = timeSinceStartTime.ToString (); Строка str1, str2; SqlDataReader rd1, rd2; SqlConnection Con = new SqlConnection ("Источник данных = 216.218.224.238; База данных = chatapp; Uid = chatappuser; pwd = 1234 @ ChatAppUser; MultipleActiveResultSets = true;"); //SqlConnection Con = new SqlConnection ("Источник данных =. \ SQLEXPRESS; Начальный каталог = Тест; ID пользователя =; Пароль =; Тайм-аут соединения = 600"); Con.Open (); rd1 = new SqlCommand ("выберите 1 верхний чат из чата, где email = '" + label4.Text + "' упорядочить по идентификатору Desc", Con) .ExecuteReader (); rd1.Read (); str1 = rd1 ["Чат"]. ToString (); rd1.Close (); rd2 = new SqlCommand ("выберите 1 верхний UserInitial из чата, где email = '" + label4.Text + "' упорядочить по идентификатору Desc", Con) .ExecuteReader (); rd2.Read (); str2 = rd2 ["UserInitial"]. ToString (); rd2.Close (); если (str1! = str2) {SqlDataReader rd3, rd4; rd3 = new SqlCommand ("выберите верхний 1 UserInitial из чата, где email = '" + label4.Text + "' упорядочить по идентификатору desc", Con) .ExecuteReader (); richTextBox1.Text = richTextBox1.Text + «
» + rd3.Read (); rd3.Close (); rd4 = new SqlCommand ("Обновить 1 верхний набор чата Chat = UserInitial, где email = '" + label4.Text + "' упорядочить по идентификатору по убыванию", Con) .ExecuteReader (); rd4.Read (); rd4.Close (); Против. Закрывать(); }} private void button1_Click (объект-отправитель, EventArgs e) {if (! _timerRunning) {//Установить время начала на Сейчас _startTime = DateTime.Now; //Сохраняем общее прошедшее время _totalElapsedTime = _currentElapsedTime; _timer.Start (); _timerRunning = true; } else//Если таймер уже запущен {_timer.Stop (); _timerRunning = false; } SqlDataReader rd5; SqlConnection Con = new SqlConnection ("Источник данных = 216.218.224.238; База данных = chatapp; Uid = chatappuser; pwd = 1234 @ ChatAppUser; MultipleActiveResultSets = true;"); //SqlConnection Con = new SqlConnection ("Источник данных =. \ SQLEXPRESS; Начальный каталог = Тест; ID пользователя =; Пароль =; Тайм-аут соединения = 600"); Con.Open (); richTextBox1.Text = richTextBox1.Text + «
Я:» + richTextBox2.Text; rd5 = new SqlCommand ("Обновить чат-набор UserInitial = '" + richTextBox2.Text + "' в порядке по идентификатору Desc, где email = '" + label4.Text + "'", Con) .ExecuteReader (); rd5.Read (); rd5.Close (); Con.Close (); } private void button3_Click (отправитель объекта, EventArgs e) {_timer.Stop (); _timerRunning = false; //Сбрасываем истекшее время TimeSpan объектов _totalElapsedTime = TimeSpan.Zero; _currentElapsedTime = TimeSpan.Zero; label3.Text = _totalElapsedTime.ToString (); MessageBox.Show (count.ToString ()); count = 0; }
Заранее спасибо …..
Вы можете использовать BackgroundWorker.
Внутри события OnDoWork вы можете добавить свою логику для извлечения данных из базы данных и обновления интерфейса через каждый фиксированный интервал. Вы можете запускать и останавливать, пожалуйста, ссылку для получения дополнительной информации о том, как его использовать.
EDIT
Я сделал небольшая демонстрация, демонстрирующая использование фонового рабочего. В любом случае вам следует улучшить свою логику для получения данных из базы данных. Примечание: в зависимости от того, насколько быстро выполняется ваш запрос, если они медленные, вы должны выполнять эти действия, извлекая данные и показывая секундомер, в разных потоках, в противном случае ваше значение секундомера будет неправильным .
частный bool _running; частный BackgroundWorker _bw; частный секундомер _watch; частный System.Timers.Timer _timer; общедоступная Form1 () {InitializeComponent (); } private void BwOnProgressChanged (отправитель объекта, ProgressChangedEventArgs e) {} private void BwOnDoWork (отправитель объекта, DoWorkEventArgs e) {BackgroundWorker worker = sender as BackgroundWorker; while (_running) {если ((worker.CancellationPending == true)) {e.Cancel = true; возвращаться; } else {//Выполняем трудоемкую операцию и сообщаем о ходе выполнения. Строка str1, str2; SqlDataReader rd1, rd2; SqlConnection Con = new SqlConnection ("Источник данных = 216.218.224.238; База данных = chatapp; Uid = chatappuser; pwd = 1234 @ ChatAppUser; MultipleActiveResultSets = true;"); //SqlConnection Con = new SqlConnection ("Источник данных =. \ SQLEXPRESS; Начальный каталог = Тест; ID пользователя =; Пароль =; Тайм-аут соединения = 600"); Con.Open (); rd1 = new SqlCommand ("выберите 1 верхний чат из чата, где email = '" + label4. Текст + "'порядок по идентификатору Desc", Con) .ExecuteReader (); rd1.Read (); str1 = rd1 ["Чат"]. ToString (); rd1.Close (); rd2 = new SqlCommand ("выберите 1 верхний UserInitial из чата, где email = '" + label4.Text + "' упорядочить по идентификатору Desc", Con) .ExecuteReader (); rd2.Read (); str2 = rd2 ["UserInitial"]. ToString (); rd2.Close (); если (str1! = str2) {SqlDataReader rd3, rd4; rd3 = new SqlCommand ("выберите верхний 1 UserInitial из чата, где email = '" + label4.Text + "' упорядочить по идентификатору desc", Con) .ExecuteReader (); значение переменной = rd3.Read (); rd3.Close (); if (richTextBox1.InvokeRequired) {richTextBox1.BeginInvoke (новый MethodInvoker (() => richTextBox1.Text + = richTextBox1.Text + "
" + значение)); } else {richTextBox1.Text = richTextBox1.Text + «
» + значение; } rd4 = new SqlCommand ("Обновить 1 верхний набор чата Chat = UserInitial, где email = '" + label4.Text + "' упорядочить по идентификатору по убыванию", Con) .ExecuteReader (); rd4.Read (); rd4.Close (); Con.Close (); } Thread.Sleep (1000); //засыпаем 1 секунду}//System.Threading.Thread.Sleep(500); }} void _timer_Elapsed (отправитель объекта, ElapsedEventArgs e) {if (label3.InvokeRequired) {label3.BeginInvoke (новый MethodInvoker (() => label3.Text = _watch.Elapsed.Seconds.ToString ())); } еще {label3.Text = _watch.Elapsed.Seconds.ToString (); }} private void button1_Click (отправитель объекта, EventArgs e) {_running = true; _watch = новый секундомер (); _watch.Start (); _bw.RunWorkerAsync (); //запускаем таймер _timer.Start (); } private void Form1_Load (отправитель объекта, EventArgs e) {_bw = new BackgroundWorker (); _bw.WorkerReportsProgress = true; _bw.DoWork + = BwOnDoWork; _bw.ProgressChanged + = BwOnProgressChanged; //создание экземпляра таймера _timer = new System.Timers.Timer (); _timer.Interval = 1000; _timer.Elapsed + = _timer_Elapsed; } private void button2_Click (отправитель объекта, EventArgs e) {_running = false; _bw.CancelAsync (); } private void Form1_FormClosing (отправитель объекта, FormClosingEventArgs e) {//удаляем ресурсы _bw.CancelAsync (); _bw.Dispose (); _watch.Stop (); _timer.Dispose (); }
Чтобы удалить Thread.Sleep (1000)
, вы можете оставить свой таймер только на секундомер в потоке формы и назначить обновление чата работать с фоновым работником. Таким образом, прошедшее время будет более точным.
Вы можете использовать класс StopWatch, чтобы узнать количество времени Elapsed
Из MSDN:
Предоставляет набор методов и свойств, которые можно использовать для точного измерения прошедшее время.
Шаг 1: создайте переменную StopWatch
как переменную уровня класса.
Шаг 2: вызовите метод Start ()
всякий раз, когда вы хотите начать подсчет.
Шаг 3: для каждого события timer_tick
вы можете взять общее количество секунд, прошедшее с помощью секундомера, использованного .. Секунды
.
Попробуйте это:
Секундомер watch = new Stopwatch (); watch.Start (); private void timer_Tick ( отправитель объекта, EventArgs e) {label1.Text = watch.Elapsed.Seconds.ToString ();}
Трехзначный секундомер
Я решил сделать секундомер, поскольку решил, что он будет полезен, а также в качестве задачи узнать больше о том, как формируется работай. Мне просто нужен простой совет относительно всего, что я могу сделать лучше, спасибо.
using System; using System.Collections.Generic; using System.ComponentModel; using System .Data; использование System.Drawing; использование System.Linq; использование System.Text; использование System.Threading.Tasks; использование System.Windows.Forms; пространство имен Stopwatch {общедоступный частичный класс Form1: Form {Timer timer = new Timer (); интервал секунд = 0; int минут = 0; int часов = 0; общедоступная Form1 () {timer.Interval = 1000; timer.Tick + = Timer_Tick; InitializeComponent (); } private void Timer_Tick (отправитель объекта, EventArgs e) {IncrementStopwatch (); UpdateLabels (); } частная пустота IncrementStopwatch () {секунды ++; если (секунд == 60) {секунд = 0; минут ++; если (минут == 60) {минут = 0; часы ++; }}} private void UpdateLabels () {Seconds.Text = KeepStyle (секунды); Minutes.Text = KeepStyle (минуты); Hours.Text = KeepStyle (часы); } закрытая строка KeepStyle (int s) {if (s
-
Используйте System.Diagnostics.Stopwatch вместо хранения отдельных переменных для часа, минуты и секунды. В нем уже есть вся логика для запуска/остановки/сброса, логика перехода от секунд к минутам. и т.д. Еще одним преимуществом является то, что он более точен. Однако вам все равно понадобится таймер для обновления пользовательского интерфейса.
-
Используйте согласованное именование для элементов управления формы; кнопки могут заканчиваться на «Button», а ярлыки могут заканчиваться на «Label».
-
Вместо этого перетащите компонент Timer из панели инструментов в форму, это позволяет Windows. Forms, чтобы утилизировать его должным образом.
-
Удалите неиспользуемые использования.
using System; using System. Windows.Forms; пространство имен Секундомер {открытый частичный класс Form1: Форма {частный System.Diagnostics.Stopwatch секундомер = новый System.Diagnostics.Stopwatch (); общедоступная Form1 () {InitializeComponent (); //TODO: перейти к конструктору winforms. timer.Tick + = Timer_Tick; таймер. Включено = истина; } private void Timer_Tick (отправитель объекта, EventArgs e) {var elapsed = stopwatch.Elapsed; SecondsLabel.Text = elapsed.Seconds.ToString ("00"); MinutesLabel.Text = elapsed.Minutes.ToString ("00"); HoursLabel.Text = elapsed.Hours.ToString ("00"); } private void StartStopButton_Click (отправитель объекта, EventArgs e) {если (секундомер.IsRunning) {StartStopButton.Text = "Старт"; секундомер.Stop (); } else {StartStopButton.Text = "Стоп"; секундомер.Start (); }} закрытый void ResetButton_Click (отправитель объекта, EventArgs e) {var isRunning = stopwatch.IsRunning; секундомер.Reset (); если (isRunning) {секундомер.Start (); }}}}
$ endgroup $
Вместо:
приватная строка KeepStyle (int s) {if (s
вы можете:
s.ToString ("00");
См. здесь
Вместо:
private void StartStopButton_Click (отправитель объекта, EventArgs e) {timer. Включено =! Timer.Enabled; если (! timer.Enabled) StartStopButton.Text = "Старт"; иначе, если (timer.Enabled) StartStopButton.Text = "Стоп"; }
Вы можете:
private void StartStopButton_Click (отправитель объекта, EventArgs e) {start = DateTime.Now; //См. Ниже timer.Enabled =! Timer.Enabled; StartStopButton.Text = timer.Enabled? «Стоп»: «Старт»; }
Рассмотрите возможность использования объекта DateTime
вместо ваших часов, минут, секунд
поля:
private DateTime start;
Затем вы можете пропустить IncrementStopwatch ()
и в UpdateLabels ()
сделайте что-то вроде этого:
private void UpdateLabels () {TimeSpan duration = DateTime.Now - start; Seconds.Text = duration.Seconds.ToString ("00"); Минуты.Текст = продолжительность.Минуты.Тостринг ("00"); Hours.Text = duration.Hours.ToString ("00"); }
Не забудьте удалить объект Timer
при удалении формы
защищенное переопределение void Dispose (логическое удаление) {if (удаление && (компоненты! = null)) {components.Dispose (); } если (удаление) {если (таймер! = ноль) timer.Dispose (); таймер = ноль; } base.Dispose (утилизация); }
( Dispose (bool Dispose)
можно найти в Form1.Designer.cs)
$ endgroup $