3

我有兴趣制作具有更多响应式设计和功能的更好程序。如今,当我创建远程访问数据的程序时,我的界面会冻结,并且没有动画 GIF 可以在这种情况下工作。

David Hefferman 告诉我,在 VCL 中创建的动画 GIF 即使在线程中也不会响应,因为 VCL 在主线程中,数据库也是如此。

我的疑问是如何使用线程,特别是在数据库中,所以我对此有很多疑问。

我必须在线程函数和过程中实现我的整个数据库吗?如果这是正确的,那么我不能通过将组件拖放到表单来使用数据库,对吗?但是用户输入和网格呢?它们会与这些线程一起正常工作,还是我必须使用常规用户TEdit而不是TDBEdit将其内容发送到插入/更新 sql 命令?

这里的主要目标是创建 Delphi 应用程序,该应用程序使用 Zeos 访问远程数据库(如 MySQL),但不会因服务器中的每一滴咨询而冻结。至少那些较小的。如果系统将记录列表下载到表中并且用户仍然可以输入内容,那将非常难看。对于这些情况,我非常希望我的动画 GIF(或其他解决方案)可以工作。

非常感谢您的帮助!

4

1 回答 1

3

根据我的经验,最好的方法是将数据库组件放在数据模块上,然后在每个线程中动态创建这个数据模块。如果在使用它们的线程中创建和初始化数据库组件,它们通常可以正常工作。

但是,有一点需要注意——如果您要连接到 Firebird 数据库,您应该确保当时只有一个线程正在建立连接。(在连接到数据库的代码周围使用关键部分。)这适用于 Firebird 1.5、2.0 和 2.1,但对于 Firebird 2.5 可能不再需要(我还没有机会测试它)。

编辑(回答 EASI 的评论):是的,连接到数据库可能需要一些时间。如果您经常需要执行短操作,最好让线程保持连接并运行更长的时间。

我可以想到两种方法来做到这一点。1)保持线程处于活动状态并连接并在内部运行消息循环。这个循环将从主线程接收命令,处理它们并返回结果。2) 在线程池中保持线程的初始化和连接,并在需要执行数据库操作时激活它们。

基本上,这两种方法都是相同的,不同之处在于处理“接收和处理命令”循环的级别。

第二种方法可以通过使用该机制在OmniThreadLibrary中轻松实现。IOmniConnectionPool.SetThreadDataFactory有关详细信息,请参阅向 OmniThreadLibrary 添加连接池机制和演示24_ConnectionPool。或者,您可以使用高级抽象后台工作程序,您可以在任务初始化块中基于每个线程建立数据库连接。

于 2013-03-22T16:46:03.703 回答