Application.ProcessMessages darf nicht im Kontext des Threads laufen; da beisst keine Maus einen Faden ab!
Dein Thread sollte auch nicht unbedingt mit höherer Prio laufen.
Wenn dein Thread auf die Benutzeroberfläche zugreifen muss, dann immer mit der Methode
Synchronize:
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
for i := ... to ... do
begin
FStatus := 'Lese '+ IntToStr(i);
Synchronize(UpdateLabel);
DatenLesen;
FStatus := 'Verarbeite '+ IntToStr(i);
Synchronize(UpdateLabel);
Datenverarbeiten;
Synchronize(UpdateGui);
if Terminated then Exit; // wichtig, um den Thread sauber abbrechen zu können
end;
end;
procedure TMyThread.UpdateLabel;
begin
form1.StatusLabel.Caption := FStatus;
form1.StatusLabel.Refresh;
end;
procedure TMyThread.UpdateGui;
begin
form1.vsg1.items.Add(....);
form1.vsg1.refresh;
end;
Der Trick ist nun, dass Synchronize eine Windows Botschaft in die Messagequeue setzt
und die Methode UpdateGui im Kontext der Hauptthreads ausgeführt wird.
Über Synchronize kannst du nur eine Methode ohne Parameter aufrufen.
Diese Einschränkung lässt sich umgehen, indem die Parameter als Variablen im Thread-Objekt gespeichert werden.
Übrigens:
Wenn dein Thread niemals wartet (WaitforMultipleObjects), dann ist es ganz normal, dass die CPU-Auslastung auf 100% geht!