pdos
Messages postés2Date d'inscriptionmercredi 8 novembre 2000StatutMembreDernière intervention28 novembre 2008
-
21 nov. 2008 à 15:59
beckerich
Messages postés302Date d'inscriptionjeudi 29 septembre 2005StatutMembreDernière intervention17 septembre 2013
-
28 nov. 2008 à 23:03
Bonjour,
Je suis en cours de programmation d'une petite application qui gère une base de données (récupération d'un fichier texte avec séparateur, dans une base, création de l'index, etc). Le traitement dure plus ou prou 3 à 4 minutes. Au démarrage de ce traitement dans la Form1, j'ouvre une form2 avec création d'un progressbar par thread. Apparement le thread ne s'execute qu'à la fin du traitement ???
Ci- joint le code. Merci pour votre aide.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
unit Unit1;
beckerich
Messages postés302Date d'inscriptionjeudi 29 septembre 2005StatutMembreDernière intervention17 septembre 20132 28 nov. 2008 à 19:23
bonsoir,
ajoute quelques Application.ProcessMessages dans le code, cela permettra peut-être d'afficher la progression.
procedure TForm1.Button1Click(Sender: TObject);
begin
Form3.Show;
Application.ProcessMessages;
Dbf1.Open;
Dbf1.Close;
Dbf1.Exclusive := true;
Dbf1.Open;
Dbf1.RegenerateIndexes; // une des parties du traitement
Application.ProcessMessages;
pdos
Messages postés2Date d'inscriptionmercredi 8 novembre 2000StatutMembreDernière intervention28 novembre 2008 28 nov. 2008 à 20:37
Bonsoir,
Désolé 'beckerich' mais la solution proposée ne résoud pas le problème. Apparement, le processus de la gestion de base de données prend le dessus et ne rend pas la main au thread ???
beckerich
Messages postés302Date d'inscriptionjeudi 29 septembre 2005StatutMembreDernière intervention17 septembre 20132 28 nov. 2008 à 21:36
j'ai déjà vu une solution quelque part, avec l'utilisation d'une fonction de rappel, mais je ne sais plus où... ça ne t'avance pas, désolé .
Si tu as le source de TDBF, essaye de le modifier et d'ajouter soit un appel à ProcessMessages dans procedure TDbfFile.PackIndex ou d'appeler une fonction de rappel lors du processus.
Une fonction de rappel est une fonction que tu passes comme argument à une autre fonction.
Modifie RegenerateIndex pour pouvoir lui fournir une fonction de rappel.
Modifie PackIndex pour pouvoir lui passer cette fonction.
Dans PackIndex,
try
while cur <= last do
begin
ReadRecord(cur, FPrevBuffer);
lIndexFile.Insert(cur, FPrevBuffer);
---> appel de la fonction de rappel
inc(cur);
end;
except
on E: EDbfError do
begin
lIndexFile.DeleteIndex(lIndexFile.IndexName);
raise;
end;
end;
et dans la fonction de rappel que tu as définit dans ton programme, tu mets la barre de progression à jour.
J'espère que cela peut aller car je n'ai pas installé TDBf, donc je ne peux pas tester ce que j'avance...
Bonne soirée à coder,
Luc.