鼠标滚轮和检查更改值事件之间的延迟

时间:2012-07-27 21:22:11

标签: c# winforms

对于轨迹栏和数字上/下(以及其他内容),似乎每当值更改时,在更改之间的延迟非常短时触发事件。

这对我来说是一个问题,因为无论何时值发生变化,我都会执行一些需要花费大量时间来处理的函数(例如,大约100-200毫秒,具体取决于输入的大小)

我注意到当我使用鼠标滚轮增加/减少该值时,它会记录4个更改事件(打印“已更改!”4次到调试控制台),因此这些功能执行4次。这可能是我对鼠标滚轮的设置。

即使我手动点击轨迹栏以使其“大幅增加”,它也会注册2个更改事件。

我希望函数在值更改时运行,但不是单个鼠标滚轮滚动触发4个调用的点。我只需要最近的价值。

解决方案是强制用户手动按下按钮来执行命令,但我希望进行某种“实时”更新。

2 个答案:

答案 0 :(得分:2)

让数字控件的事件设置一个标志。添加一个Timer控件,每500毫秒运行一次,检查该标志,如果设置,则调用实际方法并清除该标志。如果要确保处理最后一个值集,请先清除标志

答案 1 :(得分:0)

扩展所有交易的Jon建议..

使用DateTime?而不是简单的标记。当事件触发时,设置eventLastTriggered = DateTime.Now。然后在你的计时器的Tick处理程序中执行此操作

private void timer_Tick(object sender, EventArgs e)
{
    if (eventLastTriggered.HasValue
        && (DateTime.Now - eventLastTriggered.Value) >= UpdateDelay)
    {
        eventLastTriggered = null; // reset it so we don't update again
        Update();
    }
}

static readonly TimeSpan UpdateDelay = TimeSpan.FromMilliseconds(whatever);

您将获得持续的更新延迟,但您不会收到更新垃圾邮件。您可以调整UpdateDelay以获得最佳效果。