Ich habe gerade festgestellt, dass ich mit Synchronize generell noch ein Problem habe.
Mein Thread ist folgendermaßen deklariert:
Delphi-Quellcode:
type
TJobThread = class(TThread)
private
protected
procedure Execute; override;
public
Job: TJob;
procedure Sync(AMethod: TThreadMethod);
constructor Create;
end;
implementation
{ JobThread: }
constructor TJobThread.create;
begin
inherited Create(true);
end;
procedure TJobThread.Execute;
begin
Job.Execute(self);
end;
procedure TJobThread.Sync(AMethod: TThreadMethod);
begin
Synchronize(AMethod);
end;
In der Methode Job.Execute wird schließlich die tatsächliche "Arbeitsmethode" aufgerufen. Dabei wird der Thread mit überliefert:
Delphi-Quellcode:
procedure TJob.Execute(Sender: TObject);
begin
if assigned(fOnJobExecute) then
fOnJobExecute(Self,TJobThread(Sender))
end;
Der Methodenzeiger fOnJobExecute zeigt auf eine Methode, die sich nicht in der gleichen
Unit befindet. Deshalb kann ich dort nicht die private Prozedur Synchronize des Threads aufrufen.
Ich habe mir also in TJobThread eine öffentliche Prozedur erstellt, die einfach nur auf Synchronize verweist.
Wenn ich jedoch jetzt in der "Arbeitsmethode" folgendes Aufrufe, dann bleibt die Anwendung dabei hängen:
Delphi-Quellcode:
TaskLogForm := TTaskLogForm.Create(MainForm);
try
with TaskLogForm do begin
JobThread.Sync(Show); // <-- Hier gehts nicht weiter
JobThread.Sync(Memo.Clear);
Job := Sender;
JobThread.Sync(DoSetTitle);
JobThread.Sync(SetWaitCursor);
end;
//..
finally
TaskLogForm.Free;
end;
Kann mir jemand sagen, was ich falsch mache?