2个事件之间的时间延迟问题

时间:2018-12-28 13:30:21

标签: c#

我有一个任务是制作反射计应用程序,我以exe为例。我成功了,但是我得到的示例和我的应用程序没有得到相同的结果,就像我在某处丢失了60-70毫秒。应用程序应该在0.5到5秒之间的任意时间显示文本,并且当文本显示时,用户应该单击一个按钮,该按钮将停止我在这里使用的秒表类,并将其写入最后和最佳时间。

首先,我将TotalMilliseconds,秒,毫秒和分钟保存为double,现在保存为TimeSpan,我觉得当我将其保存在TimeSpan中时,它减少了时间,但不足以关闭它作为示例应用程序甚至是在线反射应用程序。我在考虑事件之间甚至鼠标单击之间的延迟,但是我不认为它应该像50 60 ms。如果那是问题,那么如何测量这些。

这些是开始事件

private void Start_B_Click(object sender, EventArgs e)
{
    Random rnd = new Random();

    RndTimer.Interval = rnd.Next(500, 5000);
    RndTimer.Start();
}
Stopwatch s = new Stopwatch();
private void RndTimer_Tick(object sender, EventArgs e)
{
    NOW_L.Visible = true;
    s.Reset();
    s.Start();
    Random rnd = new Random();
    RndTimer.Interval = rnd.Next(500, 5000);
}

这是按钮点击事件

public double o;
private void Click_B_Click(object sender, EventArgs e)
{
    if (NOW_L.Visible == true)
    {
        s.Stop();
        TimeSpan ts = s.Elapsed;
        NOW_L.Visible = false;

        if (LtimeRez_LB.Text == "00:00:00" || ts.TotalMilliseconds < class1.m)
        {
            LtimeRez_LB.Text = ts.Minutes.ToString() + ":" + ts.Seconds.ToString + ":" +
                               ts.Milliseconds.ToString();
            BesttimeRez_LB.Text = ts.Minutes.ToString() + ":" + ts.Seconds.ToString + ":" +
                                  ts.Milliseconds.ToString();
            class1.m = ts.TotalMilliseconds;
            o = class1.m;
        }
        else if (ts.TotalMilliseconds > o || ts.TotalMilliseconds == o)
        {
            LtimeRez_LB.Text = ts.Minutes.ToString() + ":" + ts.Seconds.ToString + ":" +
                               ts.Milliseconds.ToString();
        }
        NOW_L.Visible = false;
    }
}

LtimeRez变量是显示最后结果的标签,而BestTimeRez是最佳时间结果,我也使用了称为m的公共静态双变量

2 个答案:

答案 0 :(得分:1)

使用Button的MouseDown事件而不是Click事件。 Click事件只会在用户按下控件上的鼠标按钮后的某个时间触发,因为它首先等待用户也释放鼠标按钮,并且还必须首先执行一些内部任务(重新绘制按钮,进行有效性检查。

有关代码的其他说明:

不要每次都创建Random类的新实例。一次创建一个实例,并一直重复使用。参见How do I generate a random int number in C#?

在“计时器滴答”功能中,只有在设置计时器间隔后才能启动秒表。该按钮实际上只有在代码离开该功能时才可见,并且有机会再次处理Windows消息。

请给om赋予一些有意义的名称。您不需要两个变量。它们始终具有相同的价值。您只需要其中之一。

CLick_B_Click中,else部分中不需要if。

在当前版本的代码中,当用户没有立即单击时,计时器单击事件可能会在用户单击按钮之前发生多次,从而使秒表重置得太早了...

答案 1 :(得分:-1)

我在这里看到的一个问题是代码中的字符串连接。在C#世界中,连接时应使用String.Format()方法。使用加号运算符加入字符串会增加延迟。因此,使用下面的行来形成字符串-

LtimeRez_LB.Text = String.Format("{0}:{1}:{2}", ts.Minutes, ts.Seconds, ts.Milliseconds);  

〜Nilesh