C#计时器不工作?

时间:2013-12-07 10:36:11

标签: c# .net winforms visual-studio-2008 timer

这是Form1

我正在尝试使用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++;

定时器的间隔取决于变量“level”的值,该变量位于form2中

       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();
    }

3 个答案:

答案 0 :(得分:3)

一般建议

好的,我不认为您的代码确实存在错误,只有一些问题可能会让您觉得代码无效。

首先,我建议你考虑更恰当地命名你的课程。我个人倾向于在功能之后命名我的表单。因此,您可以考虑将Form8重命名为DifficultyForm。通过这种方式,您可以更轻松地理解代码。此外,像elapsedLevelTime这样的名称可以让您了解计时器的用途。如果其他人查看了您的代码,那么此人就不会真正了解timer1使用

回顾问题

现在让我们快速回顾一下代码应该做什么:用户似乎选择某种难度。然后,显示另一个窗口。在所示窗口中,计时器应该递增,直到达到某个时间。然后将显示文本“time ended”。

如您所述,您在Designer中创建了很多东西。所以我假设所有事件都正确附加。这导致了结论,罪魁祸首位于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 - 尽管有趣的名字 - 是一种有价值的方法。让我们逐步完成您的代码。

  • 加载表单时启动计时器。您没有真正指定计时器设置,但默认计时器的间隔为100毫秒。因此tick方法每秒提高10次左右。

  • 当计时器滴答时,time将增加1。因此,1秒后,time将为10。

  • 现在您正在检查所选级别是否专家。所以我们必须在这里选择:

    一个。水平是专家。在这种情况下,您将间隔设置为10000。这将导致{10}每10秒引发一次tick事件。然后,检查time - 变量是否为10000。如果是这种情况,则结束计时器并显示“时间结束”。这是两个问题:

    1. 您使用if (time == 10000)代替if (time >= 10000)。这样,如果在没有检查的情况下更新time变量,您的计时器将永远不会完成
    2. 由于将时间间隔设置为10000,因此将在10000 * 10s秒后达到此条件,即大约27小时。
    3. 湾水平不是专家。在这里,我们的代码也存在一些问题:

      1. timer1.Equals(60000);在这里是一个无用的陈述。 Equals方法基本上会检查timer1 == 60000;
      2. if - 条件相同的可能问题。见上文:a1
      3. 由于默认间隔为100毫秒,因此将在60000 * 0.1s之后达到约100分钟的条件。

可能的解决方案

以下是一些改进代码的建议:

  • 在tick事件之外设置计时器间隔。它看起来像是需要的 只设置一次。

  • 检查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();
        }
    }
}

答案 1 :(得分:1)

如果这不是Web应用程序,则可以使用静态变量

即,  public staic String level =“”;

然后访问formname.level将为您提供该值。

试试这可能会对你有所帮助。

答案 2 :(得分:0)

而不是关闭尝试以下方法

private void button1_Click(object sender, EventArgs e)
{
    this.Hide();

    Form1 f1 = new Form1(this); 
    f1.Show();
}