我事先道歉标题可能会让人感到困惑,但由于我的英语问题,我不确定如何解释这个问题。
我有一个使用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
}
}
}
有人可以就我能做些什么来给我一些建议吗?
答案 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>