这是表格 1
我正在尝试使用 form2 中的变量级别来设置 form1 中的计时器间隔
int time = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
time++;
计时器的间隔根据位于 form2 中的变量“level”的值来设置
if (Form8.level.Equals("expert"))
{
timer1.Interval = 10000;
if (time == 10000)
{
timer1.Stop();
MessageBox.Show("time ended");
}
}
else
{
timer1.Equals(60000);
if (time==60000)
{
timer1.Stop();
MessageBox.Show("time ended");
}
}
}
这是Form2
这是我想在 form1 中使用的变量
public Static String level = "";
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
Form1 f1 = new Form1();
f1.Show();
}
最佳答案
一般建议
好吧,我不认为您的代码真的是错误的,只是存在一些问题可能会让人觉得您的代码无法正常工作。
首先,我建议您考虑更合适地命名您的类。我个人倾向于根据其功能来命名我的表单。因此,您可能会考虑将 Form8
重命名为 DifficultyForm
。这样就更容易理解你的代码。此外,像 elapsedLevelTime
这样的名称可以让我们了解计时器的用途。如果其他人查看您的代码,他们不会真正知道 timer1
的使用。
问题回顾
现在让我们快速回顾一下代码应该做什么:用户似乎选择了某种难度。然后,显示另一个窗口。在显示的窗口中,计时器应该递增,直到达到特定时间。然后将显示文本“时间结束”。
正如您所描述的,您在设计器中创建了很多东西。所以我假设所有事件都已正确附加。由此得出的结论是,罪魁祸首位于您的 timer1_elapsed
中,该代码实际上计算耗时:
private void timer1_Tick(object sender, EventArgs e)
{
time++;
if (Form8.level.Equals("expert"))
{
timer1.Interval = 10000;
if (time == 10000)
{
timer1.Stop();
MessageBox.Show("time ended");
}
}
else
{
timer1.Equals(60000);
if (time==60000)
{
timer1.Stop();
MessageBox.Show("time ended");
}
}
}
算法的作用以及可能的陷阱
调试算法时,Rubber duck debugging尽管名字很有趣,但这是一种有值(value)的方法。那么让我们单步调试您的代码。
加载表单后,计时器就会启动。您并未真正指定计时器设置,但默认计时器的间隔为 100 毫秒。因此
tick
方法每秒引发大约 10 次。当计时器计时时,
时间
将增加一。因此,1 秒后,时间
将为 10。现在您正在检查所选级别是否为专家。所以我们必须在这里选择:
a.水平是专家。在这种情况下,您可以将间隔设置为
10000
。这将导致每 10 秒引发一次tick
事件。然后,您检查time
变量是否为10000
。如果是这种情况,您将结束计时器并显示“时间结束”。这里有两个问题:- 您使用的是
if (time == 10000)
而不是if (time >= 10000)
。这样,如果time
变量在未经检查的情况下被更新,您的计时器将永远不会完成 - 由于将间隔设置为
10000
,该条件将在10000 * 10s
秒(大约 27 小时)后达到。
b.水平不是专家。您的代码也存在一些问题:
timer1.Equals(60000);
在这里是一个无用的语句。Equals
方法主要检查是否timer1 == 60000;
。- 与
if
条件同样可能存在问题。见上文:a1 - 由于默认间隔为 100 毫秒,因此将在
60000 * 0.1s
(大约 100 分钟)后达到该条件。
- 您使用的是
可能的解决方案
以下是一些改进代码的建议:
设置滴答事件之外的计时器间隔。看起来需要 仅设置一次。
检查
timer1.Equals(60000)的用法
检查您是否真的想要这些长间隔
确保您了解
time
包含什么值,以及它增加的频率
我尝试在一个小型 WindowsForm 项目中使用可能的解决方案重新创建您的问题:
public partial class Form1 : Form
{
private Timer secondMeasureTimer;
private int elapsedTime; //in seconds
private string level = "expert";
public Form1()
{
InitializeComponent();
secondMeasureTimer = new Timer();
secondMeasureTimer.Tick += secondMeasureTimer_Tick;
secondMeasureTimer.Interval = 1000; // 1 second resolution
}
void secondMeasureTimer_Tick(object sender, EventArgs e)
{
#if DEBUG
System.Diagnostics.Debugger.Log(0, "secondMeasure", "secondMeaserTimer ticked at " + DateTime.Now + Environment.NewLine); // Output every time the event is raised for debugging purposes
#endif
elapsedTime++; // increas time every second
if (level == "expert" && elapsedTime >= 10)
{
textBox1.Text = "10 seconds elapsed";
secondMeasureTimer.Stop();
}
else if (elapsedTime >= 60)
{
textBox1.Text = "60 seconds elapse";
secondMeasureTimer.Stop();
}
}
private void timerButton_Click(object sender, EventArgs e)
{
if (secondMeasureTimer.Enabled)
{
secondMeasureTimer.Stop();
}
else
{
elapsedTime = 0;
secondMeasureTimer.Start();
}
}
}
关于C# 定时器不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440317/