【问题标题】:How to avoid the White Blank Screen?如何避免白屏?
【发布时间】:2009-10-13 15:31:05
【问题描述】:

使用 VB6

在执行时,它在处理数据库时显示白色的空白屏幕, VB6如何避免出现白屏。

白屏意味着挂起(当它使用数据库时)。

如何避免?

【问题讨论】:

  • 这曾经一直发生在我身上。然后我学会了如何优化我的数据库以使其更快。问题消失了。
  • 这能回答你的问题吗? How to exit the program immediately?

标签: vb6


【解决方案1】:

我假设您的意思是 GUI 在执行长时间运行的操作时不会重绘自身。 (实际上从 Vista 开始不应该那么明显,但我离题了)。

如果您的长时间运行的操作由多个步骤或紧密循环组成,那么您可以不时地调用DoEvents 以使表单即使在工作时也能保持一定的响应性。

另一种选择是将您长期运行的工作迁移到一个单独的线程中,但最后我发现这在 VB6 中并非微不足道或容易实现。

【讨论】:

  • 人们在担心VB6中单独线程上的后台处理时似乎总是忽略了简单的方法。 Gopal 谈论的是数据库操作——所以只需使用 ADO 对异步处理的原生支持。或者,按照 AngryHacker 的回答并将工作委派给 ActiveX exe,以便它在单独的线程中在进程外运行。两种解决方案都可以轻松完成工作(而且它比 .NET 恕我直言中的经典多线程更容易)。
【解决方案2】:

您应该在单独的线程中处理数据库,并且任何耗时的操作也应该在单独的线程中运行。在这种情况下,您的用户界面不会被冻结。

【讨论】:

【解决方案3】:

我将此作为另一个问题的答案发布,但该模式也适用于此处:

VB6 本身是单线程的。但是,您可以通过使用在自己的进程中运行的 ActiveX EXE 使其具有某种程度的多线程性,但仍与原始 VB6 创建的 EXE 绑定。

我过去使用的是与 ActiveX EXE 结合使用的 Timer 对象。这种方法将使您能够将所有下载逻辑本地化在一个地方,像控制常规对象一样控制它并让它在单独的 EXE 中运行,因此默认情况下使其成为多线程。

所以它的工作方式是这样的:

您在 ActiveX EXE 对象上调用 LongRunningOperation 方法 在 LongRunningOperation 方法中,您实例化 Timer 并让它几乎立即启动。 您退出 LongRunningOperation 方法,从而将控制权交还给调用它的实体。 然后您通过事件(例如 LongRunningOperationProgress 或 LongRunningOperationComplete 等...)与主应用程序通信。

我推荐Timer object from Karl Petersen

【讨论】:

【解决方案4】:

这实际上与您的“How to exit the program immediately”问题相同。在这两种情况下,问题都是您的数据库操作阻止了 VB6 程序的执行。

  • 另一个问题的answer you accepted - 使用ADO 异步执行操作 - 也将解决这个空白屏幕问题。
  • 或者,如果您愿意,也可以按照我在 my answer to your other question 中的建议之一,通过 Interop 使用 .NET 后台工作组件,例如 this
  • 或者按照我的其他建议,将数据库工作委托给 ActiveX exe like this。编辑 AngryHacker 的 nice answer 对此问题使用此方法。

【讨论】:

    【解决方案5】:

    您的第一直觉应该是将资源密集型操作放在单独的线程中。这在 VB6 中有点困难,但如果调用本机 CreateThread API 可能(但不推荐)。

    您还可以迁移到 VB.NET,并在本地使用 Thread 对象。

    【讨论】:

    • 有很多比使用 CreateThread 更好的方法。使用 ADO 对异步操作的原生支持,或者像 AngryHacker 的回答那样委托给 ActiveX exe。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2018-10-18
    相关资源
    最近更新 更多