C# 多个计时器在windows窗体上似乎不起作用?
我有一个关于windows窗体的问题。我已经做了这个倒计时,可以在下面的代码和图片上看到。不过我有个问题。当我用start和stop开始第一次倒计时时,它会以小时、分钟和秒的方式运行,但当我运行第二次倒计时时,第一次倒计时会将值重置为第二次倒计时的值?它在他们两个身上都跳过了一秒钟。。第一个从第二个53到51,另一个从52到50。。你们有没有人有什么想法来解决这个问题,让他们彼此独立,他们现在显然是这样的 提前谢谢你C# 多个计时器在windows窗体上似乎不起作用?,c#,.net,winforms,countdown,C#,.net,Winforms,Countdown,我有一个关于windows窗体的问题。我已经做了这个倒计时,可以在下面的代码和图片上看到。不过我有个问题。当我用start和stop开始第一次倒计时时,它会以小时、分钟和秒的方式运行,但当我运行第二次倒计时时,第一次倒计时会将值重置为第二次倒计时的值?它在他们两个身上都跳过了一秒钟。。第一个从第二个53到51,另一个从52到50。。你们有没有人有什么想法来解决这个问题,让他们彼此独立,他们现在显然是这样的 提前谢谢你 namespace newtime { public partial
namespace newtime
{
public partial class Form1 : Form
{
private int h;
private int m;
private int s;
public Form1()
{
InitializeComponent();
}
private void btnStart1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
textBox1.Text = "0";
}
if (textBox2.Text == "")
{
textBox2.Text = "0";
}
if (textBox3.Text == "")
{
textBox3.Text = "0";
}
h = Convert.ToInt32(textBox1.Text);
m = Convert.ToInt32(textBox2.Text);
s = Convert.ToInt32(textBox3.Text);
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
s = s - 1;
if (s == -1)
{
m = m - 1;
s = 59;
}
if (m == -1)
{
h = h - 1;
m = 59;
}
if (h == 0 && m == 0 && s == 0)
{
timer1.Stop();
MessageBox.Show("Times up!", "Timer");
}
string hh = Convert.ToString(h);
string mm = Convert.ToString(m);
string ss = Convert.ToString(s);
textBox1.Text = hh;
textBox2.Text = mm;
textBox3.Text = ss;
}
private void btnStop1_Click(object sender, EventArgs e)
{
timer1.Stop();
}
private void btnStart2_Click(object sender, EventArgs e)
{
if (textBox4.Text == "")
{
textBox4.Text = "0";
}
if (textBox5.Text == "")
{
textBox5.Text = "0";
}
if (textBox6.Text == "")
{
textBox6.Text = "0";
}
h = Convert.ToInt32(textBox4.Text);
m = Convert.ToInt32(textBox5.Text);
s = Convert.ToInt32(textBox6.Text);
timer2.Start();
}
private void timer2_Tick(object sender, EventArgs e)
{
s = s - 1;
if (s == -1)
{
m = m - 1;
s = 59;
}
if (m == -1)
{
h = h - 1;
m = 59;
}
if (h == 0 && m == 0 && s == 0)
{
timer2.Stop();
MessageBox.Show("Times up!", "Timer");
}
string hh = Convert.ToString(h);
string mm = Convert.ToString(m);
string ss = Convert.ToString(s);
textBox4.Text = hh;
textBox5.Text = mm;
textBox6.Text = ss;
}
private void btnStop2_Click(object sender, EventArgs e)
{
timer2.Stop();
}
}
}
正如其他海报所指出的,您只有一份由所有计时器事件处理程序共享的
h
、m
和s
。这意味着它们将覆盖彼此的工作,正如您当前看到的那样。显而易见的解决办法是为每个计时器创建一个不同的h
、m
和s
然而,我想指出的是,你只需要一个定时器就可以解决这个问题。当用户单击每个“开始”按钮时,程序只需记录时间(从System.DateTime.Now
)并将其存储在变量中(每个计时器显示一个)。然后,在持续的基础上,它只需要计算当前时间和(存储的)开始时间之间的差异。正在进行的行为可以由单个计时器和循环触发
最好避免在应用程序中运行大量不同的计时器,因为这样您就必须担心启动、停止和单独处理每个计时器
这里是一个粗略的草案给你的想法,它可能需要一两个调整编译
struct TimerStatus
{
DateTime StartTime;
bool IsRunning;
}
TimerStatus[] _timers = new TimerStatus[10];
void Start1_Click()
{
_timers[1].StartTime = System.DateTime.Now;
_timers[1].IsRunning = true;
}
void Stop1_Click()
{
_timers[1].IsRunning = false;
}
void Start2_Click()
{
_timers[2].StartTime = System.DateTime.Now;
_timers[2].IsRunning = true;
}
void Stop2_Click()
{
_timers[2].IsRunning = false;
}
void OneAndOnlyTimer_Tick()
{
for (int i=0; i<=_timers.GetUpperBound(0); i++)
{
if (_timers[i].IsActive)
{
TimeSpan ts = System.DateTime.Now - _timers[i].StartTime;
DisplayTimer(i, ts.Hours, ts.Minutes, ts.Seconds); //You will need to write the method that does the display
}
}
}
struct TimerStatus
{
日期时间开始时间;
布尔正在运行;
}
TimerStatus[]_timers=新TimerStatus[10];
无效开始1_单击()
{
_计时器[1]。StartTime=System.DateTime.Now;
_计时器[1]。IsRunning=true;
}
void Stop1_Click()
{
_计时器[1]。IsRunning=false;
}
无效开始2_单击()
{
_计时器[2]。StartTime=System.DateTime.Now;
_计时器[2]。IsRunning=true;
}
无效停止2_单击()
{
_计时器[2]。IsRunning=false;
}
void one和onlytimer_Tick()
{
对于(int i=0;i)您有两个计时器,但您只有一组h
,m
,s
变量,您会不断覆盖这些变量。这就是您需要使用调试器并逐步完成代码的地方,您至少没有这一部分。每当您看到自己重复这样的代码时,您应该立即思考“我可能需要一个类”。一个用户控件在这里就可以了。