我有兴趣制作出更具响应性的设计和功能的更好的程序。如今,当我创建远程访问数据的程序时,我的界面冻结,并且没有动画GIF可以在这种情况下工作。
David Hefferman告诉我,在VCL中创建的动画GIF即使在线程中也不响应,因为VCL在主线程中,而数据库也是如此。
我的疑问是如何使用线程,特别是在数据库中,所以我对它有很多疑问。
我是否必须在线程函数和过程中实现我的整个数据库?
如果这是正确的,那么我不能通过将组件丢弃到表单来使用数据库,对吧?
但是用户输入和网格怎么样?它们是否可以正常使用这些线程,或者我是否必须定期使用TEdit
而不是TDBEdit
来将其内容发送到insert / update sql命令?
这里的主要目标是创建Delphi应用程序,该应用程序使用Zeos访问MySQL等远程数据库,但不会冻结服务器中的每一滴咨询。至少是较小的那些。如果系统将记录列表下载到表中并且用户仍然可以输入内容,那将是非常难看的。对于那些情况,我非常希望我的动画GIF(或其他解决方案)可以工作。
感谢您的帮助!
答案 0 :(得分:3)
根据我的经验,最好的方法是将数据库组件放在数据模块上,然后在每个线程中动态创建此数据模块。如果数据库组件在使用它们的线程中创建和初始化,则它们通常可以正常工作。
但是,有一些警告 - 如果要连接到Firebird数据库,则应确保当时只有一个线程正在建立连接。 (使用连接到数据库的代码周围的关键部分。)这适用于Firebird 1.5,2.0和2.1,但Firebird 2.5可能不再需要(我还没有机会测试它)。
编辑(回答EASI的评论):是的,连接到数据库可能需要一些时间。如果您经常需要执行短操作,最好保持线程连接并运行更长的时间。
我可以想到两种方法。 1)保持线程活动并连接并在内部运行消息循环。该循环将从主线程接收命令,处理它们并返回结果。 2)保持线程初始化并连接到线程池中,并在需要执行数据库操作时激活它们。
基本上,两种方法都是相同的,不同之处在于处理&接收和处理命令的级别。循环。
使用IOmniConnectionPool.SetThreadDataFactory
机制可以在OmniThreadLibrary中轻松实现第二种方法。有关详细信息,请参阅Adding connection pool mechanism to OmniThreadLibrary和演示24_ConnectionPool。或者,您可以使用高级抽象Background worker,您可以在Task initialization块中基于每个线程建立数据库连接。