5

我有一个可以运行很长时间扫描数据库的应用程序。
在此过程中,我使用 processmessage 保持程序响应。
当我的进度条被更新和添加时,会触发此进程消息。
这在大多数情况下都可以正常工作,但是当数据库变大时,进度条需要更长的时间才能上升 1%,程序在此之前变得无响应。

除了进程消息之外,还有其他方法可以让我的程序保持活力吗?

4

2 回答 2

8

多线程就是答案。一个标准的 Delphi 应用程序基本上是一个单线程应用程序,一次只能做一件事。因此 gui 锁定,如果它正在做其他事情,它就不能保持响应。

如果您想要一个响应式 gui 并同时进行繁重的工作,您需要在一个或多个单独的线程中进行繁重的工作。这样,您的主线程可以确保您有一个响应式程序,而工作线程可以完成繁重的工作。这适用于繁重的数据库工作,但也适用于下载文件或远程服务器的响应可能需要很长时间的情况。

但是这个答案可能会给你更多的问题然后答案,因为解释如何使用多线程对于这个问题的解释太大了。

不过还有一件事:仔细查看您的数据库代码。您如何从数据库中检索记录,数据库上是否有良好的索引等等等等。在开始考虑多线程之前,您可以通过优化此代码来获得疯狂的速度提升。

我找到了以下资源:http ://thaddy.co.uk/threads/ ,您可以在以下网址下载图片:http ://cc.embarcadero.com/item/14809 ,这是非常有用的线程教程。

于 2013-01-08T13:08:11.917 回答
4

如果您想让您的 GUI 程序显示为响应式,您必须及时为消息队列提供服务。没有替代。

在运行数据库查询时,在不冻结 UI 的情况下执行此操作的方法是将查询移动到不同的线程。

于 2013-01-08T12:46:51.750 回答