0

目前,我调用 DoEvents 以检查表单栏中Button Foo是否已被单击。这种方法有效,但它需要太多的处理能力,从而延迟了程序。

我相信如果我只能检查Button Foo是否已被单击,而不是 DoEvents 必须经过的所有其他形式,则可以减少延迟。

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

4

2 回答 2

6

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

只有极少数几种方法可以为您的临时逻辑执行此操作:

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

差不多就是这样。

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

因此,如果您只是有一个当前迭代 100,000 次的循环做某事,您可能会将其分解,以便每个 Timer 滴答声运行 500 次。量子大小可能需要根据循环中所做的事情进行调整 - 500 只是为了说明而选择的一个值。您需要对此进行调整,直到它让 UI 响应而不会过多地占用您的后台工作负载(减慢完成速度)。

于 2012-01-02T20:51:50.400 回答
1

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

解决此问题的正确方法是工作线程(有关如何在 VB6 中执行此类操作的文章,请参阅本文),但如果失败,则需要定期 DoEvents,反过来,在调用长时间运行的代码时会出现一些重入阻塞.

于 2012-01-02T23:13:30.863 回答