【发布时间】:2009-10-13 15:31:05
【问题描述】:
使用 VB6
在执行时,它在处理数据库时显示白色的空白屏幕, VB6如何避免出现白屏。
白屏意味着挂起(当它使用数据库时)。
如何避免?
【问题讨论】:
-
这曾经一直发生在我身上。然后我学会了如何优化我的数据库以使其更快。问题消失了。
-
这能回答你的问题吗? How to exit the program immediately?
标签: vb6
使用 VB6
在执行时,它在处理数据库时显示白色的空白屏幕, VB6如何避免出现白屏。
白屏意味着挂起(当它使用数据库时)。
如何避免?
【问题讨论】:
标签: vb6
我假设您的意思是 GUI 在执行长时间运行的操作时不会重绘自身。 (实际上从 Vista 开始不应该那么明显,但我离题了)。
如果您的长时间运行的操作由多个步骤或紧密循环组成,那么您可以不时地调用DoEvents 以使表单即使在工作时也能保持一定的响应性。
另一种选择是将您长期运行的工作迁移到一个单独的线程中,但最后我发现这在 VB6 中并非微不足道或容易实现。
【讨论】:
您应该在单独的线程中处理数据库,并且任何耗时的操作也应该在单独的线程中运行。在这种情况下,您的用户界面不会被冻结。
【讨论】:
我将此作为另一个问题的答案发布,但该模式也适用于此处:
VB6 本身是单线程的。但是,您可以通过使用在自己的进程中运行的 ActiveX EXE 使其具有某种程度的多线程性,但仍与原始 VB6 创建的 EXE 绑定。
我过去使用的是与 ActiveX EXE 结合使用的 Timer 对象。这种方法将使您能够将所有下载逻辑本地化在一个地方,像控制常规对象一样控制它并让它在单独的 EXE 中运行,因此默认情况下使其成为多线程。
所以它的工作方式是这样的:
您在 ActiveX EXE 对象上调用 LongRunningOperation 方法 在 LongRunningOperation 方法中,您实例化 Timer 并让它几乎立即启动。 您退出 LongRunningOperation 方法,从而将控制权交还给调用它的实体。 然后您通过事件(例如 LongRunningOperationProgress 或 LongRunningOperationComplete 等...)与主应用程序通信。
【讨论】:
这实际上与您的“How to exit the program immediately”问题相同。在这两种情况下,问题都是您的数据库操作阻止了 VB6 程序的执行。
【讨论】:
您的第一直觉应该是将资源密集型操作放在单独的线程中。这在 VB6 中有点困难,但如果调用本机 CreateThread API 可能(但不推荐)。
您还可以迁移到 VB.NET,并在本地使用 Thread 对象。
【讨论】: