不使用DoEvents,如何检测按钮是否被按下?

时间:2012-01-02 20:26:19

标签: vb6 click doevents

目前,我调用DoEvents以检查是否已单击 表单栏 中的 Button Foo 。这种方法有效但处理能力太强,延误了程序。

如果我只能检查是否点击了 Button Foo ,而不是DoEvents必须经历的所有其他表单,我相信可以减少延迟。

有关如何查看是否点击 Button Foo 的任何想法?

2 个答案:

答案 0 :(得分:6)

VB6并不是真正设计用于您正在做的事情(某种长期运行的直线代码,它不会退回以提供消息循环控制)。通常这样的任务会被委托给一个工作线程,而在VB6中这意味着一些外部组件大多数时候是用C ++实现的。

为您的ad-hoc逻辑执行此操作只需要很少的方法:

  • Hacks通过API调用创建单独的线程,由于多种原因在VB6中不太可靠。
  • 一个棘手的每个对象的ActiveX EXE实现一个类来处理长时间运行的工作负载。
  • 由GUI程序运行和监视的单独的非交互式工作程序进程

这就是它。

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

因此,如果你只是有一个循环,当前迭代100,000次做某事你可能会分解它,以便它为每个Timer tick运行500次。量子大小可能需要根据循环内部的内容进行调整--500只是为了说明而选择的值。您需要调整此值,直到它保持响应的UI而不会使您的后台工作负载过多(减慢完成速度)。

答案 1 :(得分:1)

如果您的代码足够重,无法调用DoEvents或只是定期运行,那么您的应用甚至不会知道该按钮已被按下。 DoEvents调用允许窗口,您的应用程序可以查看所有通知。

解决这个问题的正确方法是一个工作线程(请参阅this article关于如何在VB6中执行此类操作)但如果失败,则需要定期执行DoEvents,反过来,一些重新入侵阻塞调用长时间运行的代码。