2016-01-22 77 views
0

我想添加一個函數到我正在編輯的程序。在這個程序中,我有各種If語句,它們使用Microsoft Kinect設備來檢查某個人處於某個特定位置的位置,或者檢查他們的頭部動作等等,並根據他們在做什麼顯示一種反饋。如果聲明條件時間檢查

if (pitch > 10) 
{ 
    //display icon 
} 
else if (pitch <10) 
{ 
    //display icon 
} 
//etc.. 

目前,該圖標根據用戶的移動快速打開/關閉。由於這可能會讓用戶感到困惑,我希望條件在顯示前匹配幾秒鐘。例如如果(音高> 10)X秒,則顯示圖標。

不知道這樣做的最有效的方法是什麼,我試過了一個計時器和任務延遲,但我認爲這只是延遲了結果,而不是在一段時間內檢查條件。

+0

[Task.Delay](https://msdn.microsoft.com/en-us/library/hh194845(v = vs.110).aspx)另請參閱:http://stackoverflow.com/問題/ 5449956 /如何添加延遲爲2或3秒 – Habib

+0

你已經發現histeresis!對於直接與人交互的系統而言,這是一個衆所周知的問題。 –

+0

假設以上是在某種遊戲循環中,只需存儲音高第一次超過10的時間,在音高<10時將其清除,並在循環的每次迭代中檢查「DateTime.Now」是否> X秒在最初的時間之後。 – adv12

回答

0

您可以簡單地計算成功的檢查,直到達到

if (pitch > 10) 
{ 
    if(counter++ > X) 
    { 
     //display icon 
    } 
} 
else 
    counter = 0; // reset 

這需要數假設它是可以從時間的估計數。否則,你將不得不計數時間(如果你得到錯誤狀態,重置它)

你可以實施降噪最重要的是,使用相同的原則,以避免單一的錯誤來隱藏圖標。

+0

謝謝,我最終與此一起去了,它的工作完美無缺。非常感謝。 –

0

重組您主流程,用一些中間隊列/ BlockingCollection + GetConsumingEnumerable其中消耗部件使一個延遲之前開始處理任何項

這樣非常高的水平的僞代碼:

BlockingCollection<IResult> blockingQueue .. 

// Producer Task 
IResult Process(IInputRequest params) 
{ 
    if (...) 
} 

// Consuming Task 
foreach (.. blockingQueue.GetConsumerable...) 
{ 
} 

以容納暫停使用Task.Delay

請讓我知道您是否需要更多的細節

0

我會使用Microsoft的Reactive Framework(NuGet「Rx-WinForms」或「Rx-WPF」,具體取決於您的UI)。

下面是一個當鼠標懸停在標籤上3秒時更改表單背景的示例,但如果鼠標移開,則將其恢復。

 var hovers = 
      Observable 
       .FromEventPattern(h => label1.MouseEnter += h, h => label1.MouseEnter -= h) 
       .Select(x => Observable.Timer(TimeSpan.FromSeconds(3.0))) 
       .Switch() 
       .Select(x => System.Drawing.Color.Red); 

     var leaves = 
      Observable 
       .FromEventPattern(h => label1.MouseLeave += h, h => label1.MouseLeave -= h) 
       .Select(x => System.Drawing.Color.White); 

     var query = hovers.Merge(leaves); 

     var subscription = query.ObserveOn(this).Subscribe(c => this.BackColor = c);