【问题标题】:Visual C# Timer Not TickingVisual C# 计时器不计时
【发布时间】:2016-12-28 07:48:37
【问题描述】:

我为基本的 Windows 窗体应用程序编写了一些代码。但是出了点问题。我正在启动应用程序,一切正常,但如果我启动计时器,它会第一次运行并且不会重复。我该怎么办?

抱歉语法错误。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;

namespace Zamanlayıcı
{
public partial class Form1 : Form
{

    public int saat;
    public int dakika;
    public int saniye;
    public int zaman;

    public Form1()
    {
        InitializeComponent();

    }

    private void baslat_button_Click(object sender, EventArgs e)
    {
        timer1.Interval = 1000;
        timer1.Start();
    }

    private void durdur_button_Click(object sender, EventArgs e)
    {
        timer1.Stop();
    }

    private void demizle_button_Click(object sender, EventArgs e)
    {
        saat_box.Clear();
        dakika_box.Clear();
        saniye_box.Clear();
        zaman_text.Text = "00:00:00";

    }

    private void ses_checkbox_CheckedChanged(object sender, EventArgs e)
    {

    }

    private void timer1_Tick_1(object sender, EventArgs e)
    {
        int saat = int.Parse(saat_box.Text);
        int dakika = int.Parse(dakika_box.Text);
        int saniye = int.Parse(saniye_box.Text);
        int zaman = saat * 60 * 60 + dakika * 60 + saniye;

        int saat2 = zaman / 60 / 60;
        int dakika2 = zaman / 60 % 60;
        int saniye2 = zaman % 60;

        if(zaman > 0) {
        zaman--;
        zaman_text.Text = saat2.ToString("00") + ":" + dakika2.ToString("00") + ":" + saniye2.ToString("00");
        }if(zaman == 0)
        {
            MessageBox.Show("Zaman doldu!", "Bitti", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
}
}

【问题讨论】:

  • 检查以确保tick事件绑定到timer1_Tick_1
  • 当我按下开始按钮时,它会设置文本,但不会重复,所以我确定它一定会纠正事件
  • 当时的文字是什么..你在tick事件中设置了断点吗?
  • 在 durdur_button_Click() 中注释掉 timer1.Stop() 以确保它也不会被触发..
  • 在“timer1_Tick_1”过程的开头插入“timer1.enabled=false”,最后插入“”timer1.enabled=true”。但是,这些缺失的说明并不能解释您的问题。

标签: c#


【解决方案1】:

实际上,计时器会运行,timer1_Tick_1 每秒都会被调用一次。问题是你在timer1_Tick_1 中有一个局部变量zaman,它总是得到相同的值saat * 60 * 60 + dakika * 60 + saniye;,所以你总是看到那个初始值。删除局部变量,只使用字段zaman;在计时器启动时进行初始计算:

public partial class Form1 : Form {

        public int saat;
        public int dakika;
        public int saniye;
        public int zaman;

        public Form1() {
            InitializeComponent();

        }

        private void baslat_button_Click(object sender, EventArgs e) {
            timer1.Interval = 1000;
            int saat = int.Parse(textBox1.Text);
            int dakika = int.Parse(textBox2.Text);
            int saniye = int.Parse(textBox3.Text);
            zaman = saat * 60 * 60 + dakika * 60 + saniye;
            timer1.Start();
        }

        private void durdur_button_Click(object sender, EventArgs e) {
            timer1.Stop();
        }

        private void demizle_button_Click(object sender, EventArgs e) {
            textBox1.Clear();
            textBox2.Clear();
            textBox3.Clear();
            textBox4.Text = "00:00:00";

        }

        private void ses_checkbox_CheckedChanged(object sender, EventArgs e) {

        }

        private void timer1_Tick_1(object sender, EventArgs e) {


            int saat2 = zaman / 60 / 60;
            int dakika2 = zaman / 60 % 60;
            int saniye2 = zaman % 60;

            if (zaman > 0) {
                zaman--;
                textBox4.Text = saat2.ToString("00") + ":" + dakika2.ToString("00") + ":" + saniye2.ToString("00");
            }
            if (zaman == 0) {
                MessageBox.Show("Zaman doldu!", "Bitti", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
    }

【讨论】:

  • 非常感谢,有时我们可能会错过一些重要的事情:)
【解决方案2】:

就像亚历克斯所说,您在滴答事件处理程序中声明zaman,因此每次滴答(每秒)时,它都会重置值。您应该在 tick 事件处理程序之外声明您的变量,并在其中修改它们。

public partial class Form1 : Form 
{
    public int saat;
    public int dakika;
    public int saniye;
    public int zaman;

    public Form1() 
    {
        InitializeComponent();
    }

    private void baslat_button_Click(object sender, EventArgs e) 
    {
        timer1.Interval = 1000;
        int saat = int.Parse(textBox1.Text);
        int dakika = int.Parse(textBox2.Text);
        int saniye = int.Parse(textBox3.Text);
        zaman = saat * 3600 + dakika * 60 + saniye;      //You were multiplying by 60 2x - just multiply by 3600

        timer1.Start();     
    }

    private void timer1_Tick_1(object sender, EventArgs e)
    {
        int saat2 = zaman / 3600;   //You were dividing by 60 2x - just divide by 3600
        int dakika2 = zaman / 60 % 60;
        int saniye2 = zaman % 60;

        if (zaman > 0) 
        {
            zaman--;
            textBox4.Text = saat2.ToString("00") + ":" + dakika2.ToString("00") + ":" + saniye2.ToString("00");
        }
        if (zaman == 0) {
            MessageBox.Show("Zaman doldu!", "Bitti", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多