2017-10-18 142 views
2

我很抱歉提前標題可能非常混亂,但我不確定由於我的英文問題該如何解釋。接受一段時間內改變的值保持改變

我有一個使用VS2008編寫的C#表單應用程序,它不斷從外部設備讀取數據。讀取的數據爲0(OFF)或1(ON)。大多數情況下,它保持爲0,但是當系統中發生某些事情時,它變爲1並保持1 5秒鐘並返回到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

您可能正在尋找'StopWatch'來精確測量已用時間。 – Equalsk

回答

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分辨率可以滿足您的需求。

+0

感謝您的回答。我想知道如何在不使用Timer控件的情況下完成這項工作,因爲它可以持續讀取數據。在這種情況下,ValueChange事件是否使用'Stopwatch'控件? –

+1

我假設你使用'MyTick'事件處理程序和'Timer'。你是否使用了一些'ValueChanged'事件? (我不知道這個事件來自哪裏。)如果是這樣,那麼我的解決方案無論如何將工作。 – dymanoid

+0

是的,你的猜測是正確的,而MyTick是一個'定時器'控制(我不好意思首先不提)。我只是想知道爲什麼'Timer'不是一個好主意來實現我想要實現的目標。 –