为什么我的winforms秒表上的时间很慢
本文关键字:时间 我的 winforms 为什么 | 更新日期: 2023-09-27 18:00:53
我创建了一个小型winforms程序作为一个小型秒表程序。我的主要问题是时间更新得很慢
例如,我的秒表程序大约需要3.5秒才能通过1秒,我正试图弄清楚是否有更好的方法来处理时间?
我试图包括代码的所有相关部分,并且只包括代码的相关部分。
全局变量:
System.Windows.Forms.Timer microTimer;
EventHandler microTick;
AlertBox box;
string message;
Stopwatch watch;
设置定时器的方法
private void SetTimer(int miliseconds)
{
microTimer.Interval = miliseconds;
microTimer.Enabled = true;
microTimer.Tick += microTick;
microTimer.Start();
}
我的事件逻辑背后的理论是,对于计时器上的每一个刻度,它都会检查秒表上的时间,并用经过的时间更新我表单上的标签。
microTick = (m_sender, m_e) =>
{
TimeSpan t = new TimeSpan(watch.ElapsedTicks);
lblTimeDisplay.Text = t.Minutes + " : " + t.Seconds + " : " + t.Milliseconds;
};
这是我的点击事件!
private void btnStart_Click(object sender, EventArgs e)
{
SetTimer(1); //I copied this earlier in the message.
watch.Start();
}
感谢
1:最好在启动计时器之前启动秒表。。。不是在…之后。。。
2:为了在表单上正确显示时间,您需要在单独的线程上运行计时器的刻度。。。以1毫秒的间隔运行计时器将循环得如此之快,以至于它将锁定显示线程,因此后端的"UpdateDisplay"调用将无法快速启动以刷新屏幕,从而在值更改时准确地表示值。。。要确认这一点,请尝试SetTimer(1000(。。。那么它将每1秒准确显示一次。。。
要了解如何做到这一点,只需在谷歌中查找C#的线程。
这里是根据需要运行的代码的基本版本。我不得不在一个新线程中创建秒表,使其以正常速度运行。
我的用法:
using System.Threading;
主代码:
全局变量:
private new Thread starter;
private bool isThreadRunning = false;
点击事件:
private void button1_Click(object sender, EventArgs e)
{
this.isThreadRunning = true;
//create new thread to run stopwatch in
this.starter = new Thread(new ThreadStart(this.HandleTime));
this.starter.Start();
}
private void button2_Click(object sender, EventArgs e)
{
//cause the thread to end itself
this.isThreadRunning = false;
}
在线程内运行的代码
//HandleTime is inside the new thread
private void HandleTime()
{
Stopwatch threadStopwatch = new Stopwatch();
TimeSpan timespan;
threadStopwatch.Start();
while (this.isThreadRunning)
{
timespan = threadStopwatch.Elapsed;
//using invoke to update the label which is in the original thread
//and avoid a cross thread exception
if (this.InvokeRequired)
{
//read up on lamda functions if you don't know what this is doing
this.Invoke(new MethodInvoker(() =>
label1.Text = timespan.Minutes + " : " + timespan.Seconds + " : " + timespan.Milliseconds
));
}
else
{
label1.Text = timespan.Minutes + " : " + timespan.Seconds + " : " + timespan.Milliseconds;
}
}
}