Firedac,FMX Query asynchrone
Bonjour,
je tente, sans trop de succès de comprendre comment faire une requête asynchrone (ResourceOptions.CmdExecMode:=TFDStanAsyncMode.amAsync)
L'objectif remplir une listview d'une "grosse table". Visuellement le remplissage se fait en deux temps,pours les 50 premieres lignes c'est quasi instantané, ensuite (au lieu d'un SQLWait, que je pourrais caché) j'ai une animation. Problème cette animation se bloque quand même lors du second open d'où mon idée d'utiliser une requête asynchrone mais je ne trouve pas grand chose sur le sujet (à part l'exemple peu clair et que je n'ai jamais réussi à faire tourner
j'étais parti sur un code de ce genre
Code:
1 2 3
| SELECT ANNEE, NUMERO Orderid,LIV_VILLE shipName FROM FACTURES
ORDER BY ANNEE,NUMERO
&rowset |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
procedure TForm5.btnThreadClick(Sender: TObject);
var n : Cardinal;
begin
Memo1.Lines.Clear;
Orders.Active:=False;
Orders.MacroByName('rowset').AsRaw:=' ROWS 50';
n:=TThread.GetTickCount;
Orders.ResourceOptions.CmdExecMode:=TFDStanAsyncMode.amBlocking;
Orders.Active:=True;
LinkListControlToField1.Active:=False;
LinkListControlToField1.Active:=True;
Memo1.Lines.Add('Temps tick '+(TThread.GetTickCount-n).ToString);
TTask.Run(
procedure
var m : Cardinal;
Topen : TThread;
begin
m:=TThread.GetTickCount;
TThread.Synchronize(nil,
procedure
begin
AniIndicator1.Visible:=True;
AniIndicator1.Enabled:=True;
Memo1.Lines.Add('Start Thread');
end);
Orders.DisableControls;
Orders.Close;
// Orders.ResourceOptions.CmdExecMode:=TFDStanAsyncMode.amAsync; // passage en mode asynchrone mais comment on sait que c'est fini ?
Orders.MacroByName('rowset').Clear;
Orders.Open(); // c'est là que ça coince
TThread.Synchronize(nil,
procedure
begin
Orders.EnableControls;
AniIndicator1.Visible:=False;
AniIndicator1.Enabled:=False;
Memo1.Lines.Add('Fin Thread tick '+(TThread.GetTickCount-m).ToString);
end);
end
);
end; |
Seulement évidemment ça coince puisque je ne sais pas attendre la fin de l'ouverture de la requête.
j'ai même tenté un truc comme ça
Code:
1 2 3 4 5 6 7 8
| // Orders.ResourceOptions.CmdExecMode:=TFDStanAsyncMode.amAsync;
Orders.MacroByName('rowset').Clear;
TOpen:=TThread.CreateAnonymousThread(
procedure begin
Orders.Open();
end);
TOpen.Start;
while not TOpen.CheckTerminated do sleep(1000); |
Mais là il me manque un truc et je n'ai pas fouillé.