Delphi 除了processmessage之外,我还可以用什么来保持程序的响应性?

Delphi 除了processmessage之外,我还可以用什么来保持程序的响应性?,delphi,Delphi,我有一个应用程序可以运行相当长的时间扫描数据库。 在此过程中,我使用processmessage保持程序的响应性。 当我的进度条被更新和添加时,会触发此processmessage。 这种方法在大多数情况下都能正常工作,但当数据库变大时,进度条上升1%所需的时间会变长,直到那时程序才会响应 除了processmessages之外,还有其他方法可以让我的程序保持活动状态吗?如果您想让GUI程序显示出响应性,必须及时为消息队列提供服务。别无选择 在运行数据库查询时,不冻结用户界面的方法是将查询移动到

我有一个应用程序可以运行相当长的时间扫描数据库。
在此过程中,我使用processmessage保持程序的响应性。
当我的进度条被更新和添加时,会触发此processmessage。
这种方法在大多数情况下都能正常工作,但当数据库变大时,进度条上升1%所需的时间会变长,直到那时程序才会响应


除了processmessages之外,还有其他方法可以让我的程序保持活动状态吗?

如果您想让GUI程序显示出响应性,必须及时为消息队列提供服务。别无选择


在运行数据库查询时,不冻结用户界面的方法是将查询移动到其他线程。

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

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

但是这个答案可能会给你更多的问题,而不是答案,因为解释如何使用多线程对于这个问题来说太难了

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


我找到了以下资源:您可以在以下位置下载图片:非常有用的线程教程。

从线程更新UI的策略是什么?当主程序退出但线程仍在工作时,我总是遇到这个问题。@LeonardoHerrera我看不出这两个问题有什么关系。对于从线程更新UI,通常消息传递(不一定是Windows消息)是最好的方法。标准的Delphi应用程序不是单线程的。拥有多个线程并不能解决问题。将长时间运行的工作从GUI线程中移出是解决问题的办法。@DavidHeffernan现在你把我弄糊涂了。我一直认为,一个标准的Delphi程序在所有用途上都是单线程程序,除非你特别启动了额外的线程。在GUI线程下运行很长时间正是我的目的,我的意思是,你应该在答案中明确这一点。您没有明确说明您的建议是将DB工作放在不同的线程上。请尝试改用Application.HandleMessage。还将LastPercentage存储为变量。计算NewPercentage,如果NewPercentage=LastPercentage,则退出。@CapeCodGunny没有这样的事情。你是说
Application.HandleMessage
?为什么会有帮助?@David-谢谢我编辑了我的评论。它闯入并强制只进行一次更新,而不是所有挂起的Windows更新。@CapeCodGunny我知道它的作用。为什么会有帮助?@DavidHeffernan-如果百分比需要很长时间才能增加,那就没有帮助了。