目前,我调用DoEvents以检查是否已单击 表单栏 中的 Button Foo 。这种方法有效但处理能力太强,延误了程序。
如果我只能检查是否点击了 Button Foo ,而不是DoEvents必须经历的所有其他表单,我相信可以减少延迟。
有关如何查看是否点击 Button Foo 的任何想法?
答案 0 :(得分:6)
VB6并不是真正设计用于您正在做的事情(某种长期运行的直线代码,它不会退回以提供消息循环控制)。通常这样的任务会被委托给一个工作线程,而在VB6中这意味着一些外部组件大多数时候是用C ++实现的。
为您的ad-hoc逻辑执行此操作只需要很少的方法:
这就是它。
VB6文档中描述了执行此类操作的规定方法。您打破了长时间运行的循环并将逻辑转换为可重复的“量子”工作(如处理循环的n次迭代),并在Form-global数据中维护工作负载的状态。然后使用Timer控件,其间隔设置为1或16(几乎不重要,它们通常需要至少16ms来触发)并在其事件处理程序中运行工作负载量。
因此,如果你只是有一个循环,当前迭代100,000次做某事你可能会分解它,以便它为每个Timer tick运行500次。量子大小可能需要根据循环内部的内容进行调整--500只是为了说明而选择的值。您需要调整此值,直到它保持响应的UI而不会使您的后台工作负载过多(减慢完成速度)。
答案 1 :(得分:1)
如果您的代码足够重,无法调用DoEvents
或只是定期运行,那么您的应用甚至不会知道该按钮已被按下。 DoEvents
调用允许窗口,您的应用程序可以查看所有通知。
解决这个问题的正确方法是一个工作线程(请参阅this article关于如何在VB6中执行此类操作)但如果失败,则需要定期执行DoEvents,反过来,一些重新入侵阻塞调用长时间运行的代码。