Einzelnen Beitrag anzeigen

changlee
(Gast)

n/a Beiträge
 
#2

Re: Variable eines Forms ohne Synchronize im Thread ändern?

  Alt 10. Okt 2009, 17:18
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?
  Mit Zitat antworten Zitat