不止一个独立的调度员
本文关键字:独立 调度员 一个 不止 | 更新日期: 2023-09-27 17:58:09
我想创建几个计时器,倒计时x次,独立工作,更新textBlock中的时间,并在完成后做一些事情。
所以我写道:
private DispatcherTimer d1, blueTimer;
private void but1_Click(object sender, RoutedEventArgs e)
{
if (redTimer == null)
{
d1 = new System.Windows.Threading.DispatcherTimer();
d1.Tick += new EventHandler(d1_Tick);
d1.Interval = new TimeSpan(0, 0, 1);
d1.Start();
}
}
private void but2_Click(object sender, RoutedEventArgs e)
{
if (d2 == null)
{
d2 = new System.Windows.Threading.DispatcherTimer();
d2.Tick += new EventHandler(d2_Tick);
d2.Interval = new TimeSpan(0, 0, 1);
d2.Start();
}
}
private void d1_Tick(object sender, EventArgs e)
{
int time = string2time(t1.Text);
if (time > 0)
{
t1.Text = time2string(--time);
}
else
{
d1.Stop();
}
}
private void d2_Tick(object sender, EventArgs e)
{
int time = string2time(t2.Text);
if (time > 0)
{
t2.Text = time2string(--time);
}
else
{
d2.Stop();
}
}
例如,时间为15秒。当我点击但是1时,时间在倒计时,当t1是10秒时,我点击但是2,t2也是10秒,它的倒计时具有相同的时间。
为什么会发生这种情况?如何避免这种情况?
Sry误读了代码。会再看一眼的。
你能发布"字符串2时间"answers"时间2字符串"的代码吗?
还要检查您的实际代码是否与您发布的代码相同:
private DispatcherTimer d1, blueTimer; // <-- d1 and blueTimer? blueTimer is never
//mentioned. However a "redTimer" object appears in your code
private void but1_Click(object sender, RoutedEventArgs e)
{
if (redTimer == null) // <-- shouldn´t this be "(d1 == null)"?
{
d1 = new System.Windows.Threading.DispatcherTimer();
d1.Tick += new EventHandler(d1_Tick);
d1.Interval = new TimeSpan(0, 0, 1);
d1.Start();
}
}
private void but2_Click(object sender, RoutedEventArgs e)
{
if (d2 == null)
{
d2 = new System.Windows.Threading.DispatcherTimer();
d2.Tick += new EventHandler(d2_Tick);
d2.Interval = new TimeSpan(0, 0, 1);
d2.Start();
}
}
我不确定问题出在哪里。据我所知,你有两个文本框,可以在其中输入时间。在你的例子中,第一个是"15",第二个是"10"。现在单击第一个按钮,"d1"开始倒计时第一个框中的时间。当它达到"10"时,与另一个相同,您单击第二个按钮。它从"d2"开始,然后以相同的间隔倒数第二个框中的文本。如果这就是正在发生的事情,那么代码正在做它应该做的事情?或者你试图达到什么效果。不确定。
请澄清这个问题。
编辑:
你可以简化它:
private string time2string(int time)
{
string stime = "";
int m, s = 0;
m = time / 60;
//s = time - m * 60;
s = time % 60; // this is a modulo, it will divide the number by 60 and provide the
// rest. Learn to use it, it may save you a lot of work sometimes.
//stime = m < 10 ? "0" + m.ToString() : m.ToString();
//stime += ":" + (s < 10 ? "0" + s.ToString() : s.ToString());
stime = string.Format("{0:D2}:{1:D2}", m, s}; // does the same as the two previous lines
return stime;
}
除此之外,我也不知道你的代码哪里出了问题。您可以检查其中一个或两个文本框是否都有"xyz_Changed"事件,该事件的处理方式使两者显示相同的值。也许你使用这个是为了让两者都显示相同的起始值或其他什么。
我唯一能建议的是,你可以发布到目前为止的完整代码。