Hallo,
Ich bin gerade dabei etwas mit Multi-Threading zu experimentieren…
Ziel: Eine zeitlich intensive Aktion ausführen ohne, dass das GUI einfriert.
Zu diesem Zweck hab ich ein kleines Progrämmchen gemacht, das eine intensive DB-Abfrage macht und ein paar Dinge mit den Daten anstellt, eben so, dass der PC ein paar Sekunden beschäftigt ist.
Die Implementation der Thread-Klasse war eigentlich kein Problem, aber ich habe den Durchbruch noch nicht ganz geschafft: Das GUI reagiert noch immer nicht richtig während der Arbeit.
procedure TExportDicDLG.Button3Click(Sender: TObject);
var
CT: TCheckThread;
begin
CT := TCheckThread.Create(False);
try
CT.Free;
except
end;
end;
Wie kann ich nun dafür sorgen, dass das GUI nicht einfriert, wenn ich mit der Taskleiste die Programme wechsle oder mein Fenster (Main+Modal) sonstwie verdecke. Ich denke, dazu muss ich irgendwie/irgendwo Application.Process machen.
Aber wie am besten ? Einfach irgendwo an „nach Gefühl guten Stellen“ (z. B. in einem FOR-Loop) aufrufen, oder geht das auch eleganter, bzw. kann das evtl. sogar ans OS delegiert werden. Wäre vieleicht Synchronisation ein Stichwort ?
Danke & Gruss
Roger
Somit zur Frage:
Ich habe die ganze Routine mal direkt in die Execute-Methode reingepackt, erstelle mittels Button-Click mein Thread-Objekt und lasse es gleich loslegen. Anschliessend wird dieses freigegeben: