Multi-Threading

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:

procedure TExportDicDLG.Button3Click(Sender: TObject);

var
CT: TCheckThread;

begin
CT := TCheckThread.Create(False);
try
CT.Free;
except
end;
end;

Hallo Roger,
ich habe schon lange nichts mehr mit Delphi gemacht, aber die Freigabe direkt nach der Erzeugung irritiert mich.
Was bedeutet der Parameter des Create-Aufrufs ?
Der bedeutet glaube ich, daß der Thread sofort loslegen soll ?!
Also den würde ich dann erstmal auf „True“ setzen.
Dann hat die Thread-Klasse glaube ich ein Property „FreeOnExit“.
Falls ja, solltest du dieses auf „True“ setzen.
Dann brauchst du dich nicht mehr um die Freigabe kümmern.
Im Moment sieht es so aus, als ob der Thread entweder gar nicht startet oder druch „Free“ gleich wieder gestoppt wird.
Auf jeden Fall kannst du nicht in der „Button3Click“-Methode warten,
bis der Thread beendet ist. „CT“ sollte eine Member-Variable von
„TExportDicDLG“ sein.

Gruß
Thorsten