gpt4 book ai didi

delphi - FireDac 卡住 GUI

转载 作者:行者123 更新时间:2023-12-03 15:26:41 29 4
gpt4 key购买 nike

我正在 Delphi 10.1 Berlin 下使用 FireDac。

为了向用户显示数据,我使用 TDBEdit 等数据感知控件。

我使用 TFDQuery 和 TDataSource 将它们与控件链接。

这可行,但需要一些时间才能执行的长 SQL 查询会卡住 GUI。

我想知道如何在执行这些长时间运行的查询时阻止 gui 卡住。

我正在考虑后台线程。

在 wiki 上我读到 FireDac 可以使用多线程: http://docwiki.embarcadero.com/RADStudio/XE6/en/Multithreading_(FireDAC)

但是在 embarcadero 社区论坛 thread杰夫·奥弗卡什写道:

One thing I didn't see asked or Dmitry mention is you can not have TDataSource or LiveBindings against your background threaded queries. If you are background threading a query that displays the results you should disconnect the LB or DataSource, open and fetch all the data then re establish the connection.

Those two will be trying to move the cursor on you or querying the buffer for display while the buffer is very volatile being moved around in a different thread.

我想知道是否有人也使用 FireDac 并在表单上显示值可以帮助我。

最佳答案

下面的代码示例显示了从 MSSql 服务器检索记录的一种方法在使用 FireDAC 的后台线程中。这省略了一些细节。例如,在实践中,您可能希望线程的 Execute包含一个 while 循环,在该循环中,它在调用 Synchronize 后等待信号量,然后关闭/重新打开查询以根据需要频繁更新主线程。

type

TForm1 = class;

TQueryThread = class(TThread)
private
FConnection: TFDConnection;
FQuery: TFDQuery;
FForm: TForm1;
published
constructor Create(AForm : TForm1);
destructor Destroy; override;
procedure Execute; override;
procedure TransferData;
property Query : TFDQuery read FQuery;
property Connection : TFDConnection read FConnection;
property Form : TForm1 read FForm;
end;

TForm1 = class(TForm)
FDConnection1: TFDConnection;
FDQuery1: TFDQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
public
QueryThread : TQueryThread;
end;

[...]

constructor TQueryThread.Create(AForm : TForm1);
begin
inherited Create(True);
FreeOnTerminate := True;
FForm := AForm;
FConnection := TFDConnection.Create(Nil);
FConnection.Params.Assign(Form.FDConnection1.Params);
FConnection.LoginPrompt := False;

FQuery := TFDQuery.Create(Nil);
FQuery.Connection := Connection;
FQuery.SQL.Text := Form.FDQuery1.SQL.Text;
end;

destructor TQueryThread.Destroy;
begin
FQuery.Free;
FConnection.Free;
inherited;
end;

procedure TQueryThread.Execute;
begin
Query.Open;
Synchronize(TransferData);
end;

procedure TQueryThread.TransferData;
begin
Form.FDQuery1.DisableControls;
Form.FDQuery1.Data := Query.Data;
Form.FDQuery1.EnableControls;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
QueryThread.Resume;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
QueryThread := TQueryThread.Create(Self);
end;

MJN 关于书签的评论告诉您如何在 gui 中保留当前数据行位置。

顺便说一句,虽然我经常使用 TClientDataSets 完成此操作,但将这个答案放在一起是我第一次使用 FireDAC 尝试。在配置组件方面,我所做的就是将组件从组件面板中拖出,按照您的预期将它们“连接在一起”,然后设置 FDConnection 的 Params 和 FDQuery 的 Sql。

关于delphi - FireDac 卡住 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37830470/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com