接受在一段时间内保持更改的更改值

时间:2017-10-18 14:38:20

标签: c# visual-studio-2008 timer

我事先道歉标题可能会让人感到困惑,但由于我的英语问题,我不确定如何解释这个问题。

我有一个使用VS2008用C#编写的表单应用程序,它不断从外部设备读取数据。读取的数据为0(OFF)或1(ON)。大多数情况下,它保持为0,但是当系统出现问题时,它会变为1并保持1秒,然后返回0。 我的程序需要做的是始终观察值从0变为1,并计算捕获1的次数。

问题是,有时外部设备出错并且在事故发生一秒或更短时间内将值从0更改为1.

我的程序需要忽略并且不计算事件 如果值从0更改为1持续不到1秒,并且接受并计算发生 如果值从0变为1,则持续5秒的生命中持续2秒。

我在想,基本上只有当它保持1超过2秒时我才能增加计数,否则什么都不做。 我试图使用Thread.Sleep(2000),但它不起作用,我不认为这是正确的方法,但我没有找到解决方案来实现这一目标。

private int data; //will contain the data read from the ext. device
private int occurrence = 0; 
//Tick runs every 100 seconds
private void MyTick(object sender, EventArgs e)
{
    //if data becomes 1
    if(data == 1)      
    {
          Thread.Sleep(2000); //wait 2 seconds??? does not work
          //if the data stays 1 for 2 seconds, it is a valid value
          if(?????)
          {
              occurrence++; //count up the occurrence
          }
    }  
}

有人可以就我能做些什么来给我一些建议吗?

1 个答案:

答案 0 :(得分:1)

您可以跟踪检测到从0到1的切换时间点,然后检查该时间段的长度。

这样的事情:

private int occurrence; 
private int data;
private int previousData;
private DateTime? switchToOne;

private void MyTick(object sender, EventArgs e)
{
    if (data == 1 && previousData == 0) // switch detected
    {
        switchToOne = DateTime.Now; // notice the time point when this happened
    }

    // if the current value is still 1
    // and a switch time has been noticed
    // and the "1" state lasts for more than 2 seconds
    if (data == 1 && switchToOne != null && (DateTime.Now - switchToOne.Value) >= TimeSpan.FromSeconds(2))
    {
        // then count that occurrence
        occurrence++;

        // and reset the noticed time in order to count this occurrence
        // only one time
        switchToOne = null;
    }

    previousData = data;
}

请注意,DateTime不是很准确。 如果您需要执行非常准确的时间测量,则需要使用Stopwatch。但是,由于您使用了Timer(我在您的事件处理程序中推断这一点),这无论如何都不准确,我可以假设DateTime分辨率符合您的需求。< / p>