как показать секундомер в форме окна без использования таймеров

Я новичок в этом поле. Я использую таймер в своей форме 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  

$ begingroup $

  • Используйте 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 $


$ begingroup $

Вместо:

  приватная строка 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 $

Оцените статью
clickpad.ru
Добавить комментарий