2012-01-02 75 views
0

目前,我打电话的DoEvents,以检查是否按钮富表格酒吧已被点击。这种方法可行,但它需要太多的处理能力,延迟了程序。不使用DoEvents,如何检测按钮是否被按下?

我相信,如果我只能检查按钮富已被点击,而不是所有其他形式的的DoEvents要经过的延迟可能会减少。

关于如何检查是否有任何想法Button Foo被点击?

+3

按钮会生成一个事件,您可以为该事件编写处理程序。如果您使用的是DoEvents,您可能会从阅读有关VB6事件处理的更多好处(提示:DoEvents不是一个好方法)。 – jdigital 2012-01-02 20:42:30

+0

你可能会尝试的一件事情可能会显着提高你的表现,只有每100次循环或某个这样的数字才会发生DoEvents。这将允许您的程序处理UI交互并提高您的性能。 – UnhandledExcepSean 2012-01-02 23:25:05

+2

请首先解释为什么使用按钮的事件处理程序不起作用。如果我们更了解您的代码结构,我们可能会提出另一种不会遇到同样问题的风格。 – tcarvin 2012-01-04 12:49:17

回答

6

VB6并不是真正为你看起来正在做的事情设计的(某种长时间运行的直线代码不会退出以提供消息循环控制)。通常这样的任务将被委托给工作者线程,并且在VB6中这意味着大部分时间在C++中实现一些外部组件。

目前只有极少数种办法采取为您特设逻辑做到这一点:

  • 黑客通过API调用创建单独的线程,在VB6不是很可靠的许多原因。
  • 一个棘手的每对象线程ActiveX EXE实现一个类来处理你长时间运行的工作负载。
  • 一个独立的非交互式工作人员进程将由您的GUI程序运行和监视。

就是这样。

执行此类事情的规定方法在VB6文档中描述。您打破了长期运行的循环,并将逻辑转化为可重复的“量子”工作(如处理循环的n次迭代),并在Form-Global数据中维护工作负载的状态。然后使用定时器控件,其间隔设置为1或16(几乎不重要,通常至少需要16ms才能触发),并在您的事件处理程序中运行您的工作负载量程。

所以,如果你只是有一个循环,目前迭代10万次做一些事情,你可能会分解它,使它为每个计时器滴答运行500次。量子大小可能需要根据循环内完成的事情进行调整 - 500只是一个选择用于说明的值。你需要调整它直到它离开UI的响应,而不会让你的后台工作量过多(减慢完成速度)。

1

如果您的代码足够大以至于不能拨打DoEvents或者只是定期完成运行,那么您的应用程序甚至不会知道该按钮已被按下。呼叫DoEvents允许窗口和您的应用程序赶上所有通知。

解决此问题的正确方法是工作线程(请参阅this article了解如何在VB6中执行此操作),但如果未能完成此操作,则需要定期执行DoEvents,从而导致某些重入阻止进入长期运行的代码。