2012-02-24 49 views
0

我有一个窗体上有几个按钮,当用户按下其中一个按钮时,它开始一个漫长的过程(需要几秒钟)。我想要发生的是任何后续按钮发生在窗体上的任何其他按钮都会被忽略,直到该过程从初始按钮按下完成。实际发生的情况是,随后的按钮按下进入队列,并按顺序执行每个完成的进程。我的意思是,如果每个按钮执行一个需要2秒钟的功能,并且我非常快速地按下5个按钮(在不到2秒的时间内),它会导致一系列事件需要10秒钟......我想要发生的事情是因为它导致只有FIRST按钮发生,并且采取它被激活的2秒钟的功能。当在VB.net中忙时禁止事件处理

我正在写软件,通过USB到UART转换器与硬件接口,我正在使用虚拟COM端口,并且时序非常关键。我希望在按下按钮时发生某些事情,而不是等待上一次操作完成后几秒钟后才发生。

回答

1

更困难,但成果丰硕,方法是移动繁忙的工作开了个BackgroundWorker线程。您仍然需要管理表单上的控件,以限制用户在处理先前的请求时可以执行的操作,但也可以让您的表单在完成手头任务的同时重新绘制和处理其他事件。

+0

我会试一试,我之前使用过后台工作者类,谢谢 – CHollman82 2012-02-24 20:05:41

+0

这给了我一直在寻找的行为,谢谢。 – CHollman82 2012-02-24 20:31:50

0

请考虑简单地在长时间运行的动作开始时禁用所有按钮,并在完成时重新启用它们。

+0

我试过了,它会导致视觉上的“毛刺”。当你禁用一个按钮时,它会灰显,所以当我禁用并且很快重新启用二十个按钮时,它看起来......“错误”。但是,感谢您的选择,我会认为这是最后的手段 – CHollman82 2012-02-24 19:59:11

+0

如果将按钮放在面板上然后禁用面板会发生什么?按钮是否仍然被禁用?另外,我忘记了细节,但在禁用所有按钮时没有办法抑制绘图,然后让它们全部重新禁用? – 2012-02-24 20:01:01

0

有几种方法可以做到这一点。最简单的可能是你的窗体的Enabled属性被点击第一个按钮时,后面设置为false,那么真该过程何时完成:

Try 
    this.Enabled = False; 
    ... do your work 
Finally 
    this.Enabled = True; 
End Try 
+0

尽管这看起来很糟糕,甚至使用了suspendlayout和resumelayout(它看起来不像我期望的那样工作......) – CHollman82 2012-02-24 20:11:10

0

我sugget为您在.NET中使用队列..

在每次按下添加特定的命令或枚举到队列按钮..

,并完成后,每一道工序出队的命令,并检查队列中,如果你有更多的命令或操作待办事项。

这不会让用户禁用按钮并重新启用它们。

我希望这将有助于

+0

看起来像一个很好的选择,但直到前一个事件才得到事件完成...起初,我尝试使用布尔标志来表示该应用程序很忙,并且我在每个事件上测试了这个标志,并对它进行了适当的设置和清除,但是我发现我从来没有为繁忙测试过。我相信这是因为事件处理程序本身在上一个长操作完成之前不会被调用。事件排队发生在幕后,我无法访问ot – CHollman82 2012-02-24 20:14:31