Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Probleme mit PostMessage aus einem Thread

  Alt 6. Feb 2009, 16:39
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!
Andreas
  Mit Zitat antworten Zitat