【发布时间】:2016-06-15 08:48:45
【问题描述】:
我在 Delphi 10.1 Berlin 下使用 FireDac。
为了向用户显示数据,我使用 TDBEdit 等数据感知控件。
我使用 TFDQuery 和 TDataSource 将它们与控件链接起来。
这可行,但需要一些时间执行的长 sql 查询会冻结 GUI。
我想知道如何在执行那些长时间运行的查询时阻止 gui 冻结。
我在考虑后台线程。
在 wiki 上,我读到 FireDac 可以使用多线程: http://docwiki.embarcadero.com/RADStudio/XE6/en/Multithreading_(FireDAC)
然而在 embarcadero 社区论坛threadJeff Overcash 写道:
我没有看到有人问或 Dmitry 提到的一件事是你不能拥有 TDataSource 或 LiveBindings 针对您的后台线程查询。 如果您正在后台处理显示结果的查询 应该断开 LB 或 DataSource,打开并获取所有数据 然后重新建立连接。
这两个将尝试将光标移动到您身上或查询 用于显示的缓冲区,而缓冲区非常不稳定正在移动 在不同的线程中。
我想知道是否有人也使用 FireDac 并在表单上显示值可以帮助我。
【问题讨论】:
-
您是否尝试过在后台线程执行期间断开数据源/实时绑定?如果我正确理解了报价,这应该可行。
-
试过了。但是,断开连接将清空所有表单字段,因为 TFDQuery 不再处于活动状态并重置 TDataSource,因此如果您使用的是 DBNavigator,则您不在同一位置。
-
如果您使用 TClientDataSet 执行此操作,请将其称为 CDS1,连接到 db-aware gui 组件,这样做的一种方法是使用第二个 CDS,CDS2,它在后台线程,然后一旦查询完成,调用 Synchronize 并将其 Data 属性分配给 CDS1 - 这就是它所需要的,并且分配将是即时的。我想在 FireDAC 中也可以做类似的事情。
-
可以保存和恢复结果集中的位置(使用书签)
标签: delphi concurrency firedac delphi-10.1-berlin