Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个计时器在windows窗体上似乎不起作用?_C#_.net_Winforms_Countdown - Fatal编程技术网

C# 多个计时器在windows窗体上似乎不起作用?

C# 多个计时器在windows窗体上似乎不起作用?,c#,.net,winforms,countdown,C#,.net,Winforms,Countdown,我有一个关于windows窗体的问题。我已经做了这个倒计时,可以在下面的代码和图片上看到。不过我有个问题。当我用start和stop开始第一次倒计时时,它会以小时、分钟和秒的方式运行,但当我运行第二次倒计时时,第一次倒计时会将值重置为第二次倒计时的值?它在他们两个身上都跳过了一秒钟。。第一个从第二个53到51,另一个从52到50。。你们有没有人有什么想法来解决这个问题,让他们彼此独立,他们现在显然是这样的 提前谢谢你 namespace newtime { public partial

我有一个关于windows窗体的问题。我已经做了这个倒计时,可以在下面的代码和图片上看到。不过我有个问题。当我用start和stop开始第一次倒计时时,它会以小时、分钟和秒的方式运行,但当我运行第二次倒计时时,第一次倒计时会将值重置为第二次倒计时的值?它在他们两个身上都跳过了一秒钟。。第一个从第二个53到51,另一个从52到50。。你们有没有人有什么想法来解决这个问题,让他们彼此独立,他们现在显然是这样的

提前谢谢你

namespace newtime
{
    public partial class Form1 : Form
    {
        private int h;
        private int m;
        private int s;
        public Form1()
        {
            InitializeComponent();
        }

        private void btnStart1_Click(object sender, EventArgs e)
        {

            if (textBox1.Text == "")
            {
                textBox1.Text = "0";
            }
            if (textBox2.Text == "")
            {
                textBox2.Text = "0";
            }
            if (textBox3.Text == "")
            {
                textBox3.Text = "0";
            }

            h = Convert.ToInt32(textBox1.Text);
            m = Convert.ToInt32(textBox2.Text);
            s = Convert.ToInt32(textBox3.Text);
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            s = s - 1;
            if (s == -1)
            {
                m = m - 1;
                s = 59;
            }
            if (m == -1)
            {
                h = h - 1;
                m = 59;
            }
            if (h == 0 && m == 0 && s == 0)
            {
                timer1.Stop();
                MessageBox.Show("Times up!", "Timer");
            }
            string hh = Convert.ToString(h);
            string mm = Convert.ToString(m);
            string ss = Convert.ToString(s);
            textBox1.Text = hh;
            textBox2.Text = mm;
            textBox3.Text = ss;
        }

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

        private void btnStart2_Click(object sender, EventArgs e)
        {

            if (textBox4.Text == "")
            {
                textBox4.Text = "0";
            }
            if (textBox5.Text == "")
            {
                textBox5.Text = "0";
            }
            if (textBox6.Text == "")
            {
                textBox6.Text = "0";
            }
            h = Convert.ToInt32(textBox4.Text);
            m = Convert.ToInt32(textBox5.Text);
            s = Convert.ToInt32(textBox6.Text);
            timer2.Start();
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            s = s - 1;
            if (s == -1)
            {
                m = m - 1;
                s = 59;
            }

            if (m == -1)
            {
                h = h - 1;
                m = 59;
            }

            if (h == 0 && m == 0 && s == 0)
            {
                timer2.Stop();
                MessageBox.Show("Times up!", "Timer");
            }

            string hh = Convert.ToString(h);
            string mm = Convert.ToString(m);
            string ss = Convert.ToString(s);
            textBox4.Text = hh;
            textBox5.Text = mm;
            textBox6.Text = ss;
        }

        private void btnStop2_Click(object sender, EventArgs e)
        {
            timer2.Stop();
        }
    }
}


正如其他海报所指出的,您只有一份由所有计时器事件处理程序共享的
h
m
s
。这意味着它们将覆盖彼此的工作,正如您当前看到的那样。显而易见的解决办法是为每个计时器创建一个不同的
h
m
s

然而,我想指出的是,你只需要一个定时器就可以解决这个问题。当用户单击每个“开始”按钮时,程序只需记录时间(从
System.DateTime.Now
)并将其存储在变量中(每个计时器显示一个)。然后,在持续的基础上,它只需要计算当前时间和(存储的)开始时间之间的差异。正在进行的行为可以由单个计时器和循环触发

最好避免在应用程序中运行大量不同的计时器,因为这样您就必须担心启动、停止和单独处理每个计时器

这里是一个粗略的草案给你的想法,它可能需要一两个调整编译

struct TimerStatus
{
    DateTime StartTime;
    bool IsRunning;
}

TimerStatus[] _timers = new TimerStatus[10];


void Start1_Click()
{
    _timers[1].StartTime = System.DateTime.Now;
    _timers[1].IsRunning = true;
}

void Stop1_Click()
{
    _timers[1].IsRunning = false;
}

void Start2_Click()
{
    _timers[2].StartTime = System.DateTime.Now;
    _timers[2].IsRunning = true;
}

void Stop2_Click()
{
    _timers[2].IsRunning = false;
}

void OneAndOnlyTimer_Tick()
{
    for (int i=0; i<=_timers.GetUpperBound(0); i++)
    {
        if (_timers[i].IsActive) 
        {
            TimeSpan ts = System.DateTime.Now - _timers[i].StartTime;
            DisplayTimer(i, ts.Hours, ts.Minutes, ts.Seconds);  //You will need to write the method that does the display
        }
    }
}
struct TimerStatus
{
日期时间开始时间;
布尔正在运行;
}
TimerStatus[]_timers=新TimerStatus[10];
无效开始1_单击()
{
_计时器[1]。StartTime=System.DateTime.Now;
_计时器[1]。IsRunning=true;
}
void Stop1_Click()
{
_计时器[1]。IsRunning=false;
}
无效开始2_单击()
{
_计时器[2]。StartTime=System.DateTime.Now;
_计时器[2]。IsRunning=true;
}
无效停止2_单击()
{
_计时器[2]。IsRunning=false;
}
void one和onlytimer_Tick()
{

对于(int i=0;i)您有两个计时器,但您只有一组
h
m
s
变量,您会不断覆盖这些变量。这就是您需要使用调试器并逐步完成代码的地方,您至少没有这一部分。每当您看到自己重复这样的代码时,您应该立即思考“我可能需要一个类”。一个用户控件在这里就可以了。