C# 有问题的if语句
我曾经试着问过两三次这个问题,但都不能正确地分阶段,所以我想再试一次。我正在制作一个训练秒表应用程序。应用程序的功能是计数10秒,让学员准备10秒。一旦这段时间过去了,它会计算到20秒,在这20秒中,受训者进行了一次艰苦的训练。之后,有10秒的休息时间。然后循环回到20秒的训练,继续循环8轮 我的问题是,它将开始10秒的准备,但随后它会循环回到10秒计时器。出于某种原因,我的if-else语句一直循环到准备时间。 我使用秒表和timespan作为if语句C# 有问题的if语句,c#,if-statement,windows-phone-8,C#,If Statement,Windows Phone 8,我曾经试着问过两三次这个问题,但都不能正确地分阶段,所以我想再试一次。我正在制作一个训练秒表应用程序。应用程序的功能是计数10秒,让学员准备10秒。一旦这段时间过去了,它会计算到20秒,在这20秒中,受训者进行了一次艰苦的训练。之后,有10秒的休息时间。然后循环回到20秒的训练,继续循环8轮 我的问题是,它将开始10秒的准备,但随后它会循环回到10秒计时器。出于某种原因,我的if-else语句一直循环到准备时间。 我使用秒表和timespan作为if语句 private void timer_T
private void timer_Tick(object sender, EventArgs e)
{
//throw new NotImplementedException();
//timer timespan is more than zero, start stopwatch(get the prepare counter going)
if (timerWatch.Elapsed < new TimeSpan(0, 0, 11))// if its 5sec
{
milllisecond = timerWatch.ElapsedMilliseconds;
second = milllisecond / 1000;
milllisecond = milllisecond % 1000;
minute = second / 60;
second = second % 60;
hour = minute / 60;
minute = minute % 60;
txtblTime.Text = minute.ToString("00") + ":" + second.ToString("00");
}
else if (timerWatch.Elapsed >= new TimeSpan(0, 0, 10) && timerWatch.Elapsed < new TimeSpan(0, 0, 21))//more than 4sec
{
timerWatch.Restart();
milllisecond = timerWatch.ElapsedMilliseconds;
second = milllisecond / 1000;
milllisecond = milllisecond % 1000;
minute = second / 60;
second = second % 60;
hour = minute / 60;
minute = minute % 60;
txtblTime.Text = minute.ToString("00") + ":" + second.ToString("00");
txtblPrepare.Visibility = System.Windows.Visibility.Collapsed;
txtblGo.Visibility = System.Windows.Visibility.Visible;
}
else if (timerWatch.Elapsed < new TimeSpan(0, 0, 21))
{
timerWatch.Restart();
milllisecond = timerWatch.ElapsedMilliseconds;
second = milllisecond / 1000;
milllisecond = milllisecond % 1000;
minute = second / 60;
second = second % 60;
hour = minute / 60;
minute = minute % 60;
txtblTime.Text = minute.ToString("00") + ":" + second.ToString("00");
txtblGo.Visibility = System.Windows.Visibility.Collapsed;
}
else
txtblTime.Text = "Times Up!";
}
private void timer_Tick(对象发送方,事件参数e)
{
//抛出新的NotImplementedException();
//计时器时间间隔大于零,启动秒表(启动准备计数器)
if(timerWatch.appeased=新时间跨度(0,0,10)和&timerWatch.appeased
您正在使用
timer.Restart()
这将重置计时器,因此它将再次执行第一种情况。检查的MSDN文档。当然,这个答案假设您正在使用秒表类作为计时器
我认为,它至少执行一次这些情况,以便重置计时器。您正在使用
timer.Restart()
这将重置计时器,因此它将再次执行第一种情况。检查的MSDN文档。当然,这个答案假设您正在使用秒表类作为计时器
我认为,它至少执行一次这些情况,以便重置计时器。以下是使用枚举跟踪阶段的要点。这似乎比追踪秒表和时间跨度更容易…当计时器熄灭时,事情就会改变
private enum Phases
{
Stopped,
Prep,
WorkOut,
Rest
}
private Phases thisPhase; // phase tracker
private int workOutCount; // 8 cycle counter
private void Timer1_Tick(object sender, EventArgs e)
{
Timer1.Enabled = false;
// ToDo: Fiddle with controls as needed
// also the durations...not sure if a new Prep
// follows the final rest or if they are the same
switch (thisPhase) {
case Phases.Stopped:
// start things off
thisPhase = Phases.Prep;
Timer1.Interval = 10000;
// prep time
break;
case Phases.Prep:
workOutCount = 1;
thisPhase = Phases.WorkOut;
Timer1.Interval = 20000;
// work out time
break;
case Phases.WorkOut:
thisPhase = Phases.Rest;
Timer1.Interval = 10000;
// rest time
break;
case Phases.Rest:
workOutCount += 1;
if (workOutCount == 8) {
thisPhase = Phases.Prep;
// perhaps to None, if there is an instruction timeout
Timer1.Interval = 10000;
// prep time
// actually means 10sec rest + 10 prep before next workout task
} else {
// next workout starts in...
Timer1.Interval = 10000;
// prep time
}
break;
}
Timer1.Enabled = true;
}
从VB转换可能不完美,但它应该传达出这个想法。以下是使用枚举跟踪阶段的要点。这似乎比追踪秒表和时间跨度更容易…当计时器熄灭时,事情就会改变
private enum Phases
{
Stopped,
Prep,
WorkOut,
Rest
}
private Phases thisPhase; // phase tracker
private int workOutCount; // 8 cycle counter
private void Timer1_Tick(object sender, EventArgs e)
{
Timer1.Enabled = false;
// ToDo: Fiddle with controls as needed
// also the durations...not sure if a new Prep
// follows the final rest or if they are the same
switch (thisPhase) {
case Phases.Stopped:
// start things off
thisPhase = Phases.Prep;
Timer1.Interval = 10000;
// prep time
break;
case Phases.Prep:
workOutCount = 1;
thisPhase = Phases.WorkOut;
Timer1.Interval = 20000;
// work out time
break;
case Phases.WorkOut:
thisPhase = Phases.Rest;
Timer1.Interval = 10000;
// rest time
break;
case Phases.Rest:
workOutCount += 1;
if (workOutCount == 8) {
thisPhase = Phases.Prep;
// perhaps to None, if there is an instruction timeout
Timer1.Interval = 10000;
// prep time
// actually means 10sec rest + 10 prep before next workout task
} else {
// next workout starts in...
Timer1.Interval = 10000;
// prep time
}
break;
}
Timer1.Enabled = true;
}
从VB转换可能不完美,但它应该传达出这个想法。您试图实现的是所谓的。从计时器推断这台机器的状态会使理解和读取代码变得困难。我会以更直接的方式存储状态。正如Polotoix所说,使用枚举
public enum TrainingState
{
Stopped, // The state machine is not working yet or has finished its work.
Preparing,
Working,
Resting
}
此外,还需要一个循环数计数器
private TrainingState _state = TrainingState.Stopped;
private int _roundNo;
现在您可以像这样描述状态转换
private void ChangeState()
{
switch (_state) {
case TrainingState.Stopped:
//TODO: Initialize and start the timer, display state
_state = TrainingState.Preparing;
break;
case TrainingState.Preparing:
//TODO: Adjust timer intervall for working phase, display state
_roundNo = 1; // We are going into the first round
_state = TrainingState.Working;
break;
case TrainingState.Working:
//TODO: Adjust timer intervall for resting phase, display state
_state = TrainingState.Resting;
break;
case TrainingState.Resting:
if (_roundNo == 8) {
_state = TrainingState.Stopped;
//TODO: stop timer, display state
} else {
//TODO: Adjust timer intervall for working phase, display state
_roundNo++; // We are going into the next round
_state = TrainingState.Working;
}
break;
}
}
您必须在启动时调用此方法,并在计时器\u Tick
内调用此方法
private void timer_Tick(object sender, EventArgs e)
{
ChangeState();
}
private void btnStart_Click(object sender, EventArgs e)
{
ChangeState();
}
您试图实现的是所谓的。从计时器推断这台机器的状态会使理解和读取代码变得困难。我会以更直接的方式存储状态。正如Polotoix所说,使用枚举
public enum TrainingState
{
Stopped, // The state machine is not working yet or has finished its work.
Preparing,
Working,
Resting
}
此外,还需要一个循环数计数器
private TrainingState _state = TrainingState.Stopped;
private int _roundNo;
现在您可以像这样描述状态转换
private void ChangeState()
{
switch (_state) {
case TrainingState.Stopped:
//TODO: Initialize and start the timer, display state
_state = TrainingState.Preparing;
break;
case TrainingState.Preparing:
//TODO: Adjust timer intervall for working phase, display state
_roundNo = 1; // We are going into the first round
_state = TrainingState.Working;
break;
case TrainingState.Working:
//TODO: Adjust timer intervall for resting phase, display state
_state = TrainingState.Resting;
break;
case TrainingState.Resting:
if (_roundNo == 8) {
_state = TrainingState.Stopped;
//TODO: stop timer, display state
} else {
//TODO: Adjust timer intervall for working phase, display state
_roundNo++; // We are going into the next round
_state = TrainingState.Working;
}
break;
}
}
您必须在启动时调用此方法,并在计时器\u Tick
内调用此方法
private void timer_Tick(object sender, EventArgs e)
{
ChangeState();
}
private void btnStart_Click(object sender, EventArgs e)
{
ChangeState();
}
为什么不使用枚举跟踪状态或模式
{Prep,WorkOut,Rest}
,并基于该类型的变量设置计时器间隔。切换控件等其他操作也可以对值起作用。这样,每当计时器熄灭时,您就知道一个阶段结束并进入下一个阶段。在他们开始循环/测试/竞赛之前,可能会添加一个None
。最好使用某种状态机设计问题,您正在尝试实现。谷歌。不管怎样,你为什么要重新启动计时器。我认为这就是造成问题的原因,因为计时器在第一种情况以外的情况下会重置。计时器实例的类别是什么?如果没有意义,请使用枚举跟踪状态或模式{Prep,WorkOut,Rest}
,并基于该类型的变量设置计时器间隔。切换控件等其他操作也可以对值起作用。这样,每当计时器熄灭时,您就知道一个阶段结束并进入下一个阶段。在他们开始循环/测试/竞赛之前,可能会添加一个None
。最好使用某种状态机设计问题,您正在尝试实现。谷歌。不管怎样,你为什么要重新启动计时器。我想这就是造成问题的原因,因为计时器会重置