Embarcadero Delphi
Récupération des données TDataSet mises à jour dans un thread d'arrière-plan
Recherche…
Remarques
Cet exemple FireDAC, ainsi que les autres que je compte soumettre, éviteront l'utilisation d'appels natifs pour ouvrir de manière asynchrone le jeu de données.
Exemple FireDAC
L'exemple de code ci-dessous montre un moyen d'extraire des enregistrements d'un serveur MSSql dans un thread d'arrière-plan à l'aide de FireDAC. Testé pour Delphi 10 Seattle
Comme écrit:
Le thread récupère les données en utilisant ses propres TFDConnection et TFDQuery et transfère les données dans le FDQuery du formulaire dans un appel à Sychronize ().
L'exécution récupère les données une seule fois. Il pourrait être modifié pour exécuter la requête à plusieurs reprises en réponse à un message publié à partir du thread VCL.
Code:
type
TForm1 = class;
TFDQueryThread = 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 FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
QueryThread : TFDQueryThread;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TFDQueryThread }
constructor TFDQueryThread.Create(AForm : TForm1);
begin
inherited Create(True);
FreeOnTerminate := False;
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 TFDQueryThread.Destroy;
begin
FQuery.Free;
FConnection.Free;
inherited;
end;
procedure TFDQueryThread.Execute;
begin
Query.Open;
Synchronize(TransferData);
end;
procedure TFDQueryThread.TransferData;
begin
Form.FDQuery1.DisableControls;
try
if Form.FDQuery1.Active then
Form.FDQuery1.Close;
Form.FDQuery1.Data := Query.Data;
finally
Form.FDQuery1.EnableControls;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
QueryThread.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not QueryThread.Finished then
QueryThread.Start
else
ShowMessage('Thread already executed!');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FDQuery1.Open;
QueryThread := TFDQueryThread.Create(Self);
end;
end.
Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow