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 SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT ANNEE, NUMERO Orderid,LIV_VILLE shipName FROM FACTURES ORDER BY ANNEE,NUMERO &rowset
Seulement évidemment ça coince puisque je ne sais pas attendre la fin de l'ouverture de la requête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
j'ai même tenté un truc comme ça
Mais là il me manque un truc et je n'ai pas fouillé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
Partager