我设置了一个计时器,但是通过使用按钮分别添加10秒,1分钟和10分钟无法解决如何增加时间的问题。我不确定我是否设法让它正确倒计时,因为我从计时器中复制代码并尝试将其反转。任何帮助将非常感激。 这是我的代码:
int Ten_Sec = 10000;
int One_Min = 60000;
int Ten_Min = 600000;
System.Timers.Timer t ;
int hour, min, sec;
private void Form1_Load(object sender, EventArgs e)
{
t = new System.Timers.Timer();
t.Interval = 1000; //1sec
t.Elapsed -= OnTimeEvent;
}
private void Button_Ten_Sec_Click_1(object sender, EventArgs e)
{
Ten_Sec++;
}
private void Button_One_Min_Click_1(object sender, EventArgs e)
{
One_Min++;
}
private void Button_Ten_Min_Click_1(object sender, EventArgs e)
{
Ten_Min++;
}
private void OnTimeEvent(object sender, ElapsedEventArgs e)
{
Invoke (new Action(() =>
{
sec -= 1;
if (sec == 60)
{
sec = 0;
min -= 1;
}
if (min == 60)
{
min = 0;
hour -= 1;
}
textBox_Timer.Text = String.Format("{0},{1},{2}", hour.ToString().PadLeft(2, '0'), min.ToString().PadLeft(2, '0'), sec.ToString().PadLeft(2, '0'));
}));
}
答案 0 :(得分:2)
有一些关于计时器的基本知识:
Tick
事件(或Elapsed
事件,具体取决于您使用的计时器)。它定期举办这次活动。您可以为此事件订阅一个或多个方法,并定期触发它们Interval
- 这是它在提升Tick
事件之前等待的毫秒数。Enabled
属性。如果将其设置为false,则计时器不会运行。Start
方法。调用此方法以启动计时器。它还有一个Stop
方法,您可以在希望它停止时调用该方法。这些方法还设置了Enabled
属性,因此,如果您致电Stop
,则Enabled
将设置为false
。从上到下看你的代码,我要做的第一件事是摆脱这些变量。他们没有做任何事情,TimeSpan
类已经有一种简单的方法来指定分钟数或秒数:
// We don't need these
int Ten_Sec = 10000;
int One_Min = 60000;
int Ten_Min = 600000;
此外,您正在使用System.Timers.Timer
,这可能会在尝试更新控件文本时造成一些麻烦,因为它在另一个线程中运行。相反,让我们使用System.Windows.Forms.Timer
:
public partial class Form1 : Form
{
System.Windows.Forms.Timer timer;
我们还可以使用变量来保存我们显示的时间。如果我们将其设为类级变量,那么我们可以从计时器的Tick
事件以及用户点击的按钮更改它:
public partial class Form1 : Form
{
System.Windows.Forms.Timer timer;
TimeSpan countdownClock = TimeSpan.Zero;
现在,在您的Form_Load
中,您正在做正确的事情,除非您从计时器取消订阅OnTimeEvent
。如果有的话,我们应该订阅事件,所以我们有一些代码在计时器过去时执行。
另请注意,我将您的计时器从t
重命名为timer
。它提高了可读性,并没有真正减慢编码速度,因为只要您键入t
,Visual Studio就会提供智能感知功能。我使用TimeSpan.FromSeconds
方法设置定时器间隔,这使间隔更明显:
private void Form1_Load(object sender, EventArgs e)
{
timer = new System.Windows.Forms.Timer();
timer.Interval = (int) TimeSpan.FromSeconds(1).TotalMilliseconds;
timer.Tick += OnTimeEvent;
DisplayTime();
}
您可能想知道DisplayTime()
的用途。我写了一个小函数来显示表单上的时间,因为我们从多个地方做了它并且它有一个特定的格式字符串。既然这是在一个地方完成的,如果你想改变格式,那么只有一个地方可以改变代码。
此外,我注意到您使用TextBox
来显示时间,但对于只读值,使用Label
可能更好。我创建了一个名为lblTime
:
private void DisplayTime()
{
lblTime.Text = countdownClock.ToString(@"hh\:mm\:ss");
}
现在,回答您的一个主要问题:如何在计时器到达0
时停止计时器?我们可以在OnTimeEvent
事件中执行此操作,因为这是计时器正在读取当前倒计时时钟并从中删除秒的时刻。
请注意,此方法的签名与您的签名略有不同。由于我使用的是不同类型的计时器,因此要求不同:
private void OnTimeEvent(object sender, EventArgs e)
{
// Subtract whatever our interval is from the countdownClock
countdownClock = countdownClock.Subtract(TimeSpan.FromMilliseconds(timer.Interval));
if (countdownClock.TotalMilliseconds <= 0)
{
// Countdown clock has run out, so set it to zero
// (in case it's negative), and stop our timer
countdownClock = TimeSpan.Zero;
timer.Stop();
}
// Display the current time
DisplayTime();
}
所以剩下要做的就是启用计时器。由于我们从0
开始,因此无法向下计算,但您的表单上似乎有一些按钮可以为时钟添加时间,所以让我们使用它们。 / p>
因为我们要从多个地方更新时间,这也需要检查计时器是否已禁用,如果不是,则启动它,我创建了一个辅助方法来增加时间到时钟:
private void AddTimeToClock(TimeSpan timeToAdd)
{
// Add time to our clock
countdownClock += timeToAdd;
// Display the new time
DisplayTime();
// Start the timer if it's stopped
if (!timer.Enabled) timer.Start();
}
现在,在每个按钮中,我们只需调用该功能,根据按下的按钮传递不同的时间段:
private void Button_Ten_Sec_Click(object sender, EventArgs e)
{
// Add ten seconds to our clock
AddTimeToClock(TimeSpan.FromSeconds(10));
}
private void Button_One_Min_Click(object sender, EventArgs e)
{
// Add one minute to our clock
AddTimeToClock(TimeSpan.FromMinutes(1));
}
private void Button_Ten_Min_Click(object sender, EventArgs e)
{
// Add ten minutes to our clock
AddTimeToClock(TimeSpan.FromMinutes(10));
}
希望这足以让你前进。您现在有一个倒数计时器,当它到达0
时会停止,您可以从按钮中添加时间。
答案 1 :(得分:1)
我会看一下DateTime和TimeSpan结构。您可以操纵它们以输出您想要的任何时间量以及从中添加和减去时间。根据您的示例,您可能希望使用TimeSpan
TimeSpan testTime = DateTime.Now.TimeOfDay;
public Form1()
{
InitializeComponent();
timer1.Enabled = true;
timer1.Interval = 1000;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
testTime = testTime.Subtract(new TimeSpan(0, 0, 1));
lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
}
private void button1_Click(object sender, EventArgs e)
{
testTime = testTime.Add(new TimeSpan(1, 0, 0));
lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
}
private void button2_Click(object sender, EventArgs e)
{
testTime = testTime.Add(new TimeSpan(0, 1, 0));
lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
}
private void button3_Click(object sender, EventArgs e)
{
testTime = testTime.Add(new TimeSpan(0, 0, 1));
lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
}