If语句条件时间检查

If Statement Condition Time Check

我正在尝试向我正在编辑的程序添加一个功能。在这个程序中,我有各种 If 语句,这些语句使用 Microsoft Kinect 设备来检查一个人在某个位置的任何位置或检查他们的头部运动是什么样的等,并根据他们在做什么,显示一种反馈。

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

目前,图标正在根据用户的动作快速转动on/off。因为这可能会让用户感到困惑,所以我希望条件在显示之前匹配几秒钟。例如如果 (pitch > 10) 持续 X 秒,则显示图标。

不确定最有效的方法是什么,我尝试了计时器和任务延迟,但我认为这只会延迟结果,而不是检查一段时间内的情况。

重组您的主要流程,使用一些中间队列/BlockingCollection+GetConsumingEnumerable,其中消费部分在开始处理任何项目之前进行延迟

非常高级的伪代码:

BlockingCollection<IResult> blockingQueue ..

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

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

适应暂停使用Task.Delay

如果您需要更多详细信息,请告诉我

您可以简单地计算成功的检查数,直到达到所需的数量

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

这是假设可以根据时间估计数量。否则你将不得不计算时间(如果条件错误则重置它)

您可以在此基础上使用相同的原理实施降噪,以避免单一错误隐藏图标。

我会为此使用 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);