Hmm.. Queue scheint nicht aufgerufen zu werden... mit Synchronize funktionierts...
Vorgang: Der asynchrone Thread, der die Daten von externen Schnittstellen entgegennimmt, erzeugt pro Änderung / Durchlauf einen Workerthread.
Der Workerthread triggert eine Routine des Owners, der wiederum einen Event nach aussen legt. Mit Synchronize wird der Workerthread im Hauptthread ausgeführt, während der asynchrone Thread weiterläuft.
Code:
(****************************************************************************)
(** TG6BxWorkerThread **)
(** ================== **)
(** BX Workerthread **)
(** Wird innerhalb des CmdRWThread erzeugt. **)
(** Dieser Thread dient dazu, via MainThread Bildschirmausgaben zu **)
(** aktualisieren. **)
(****************************************************************************)
TG6BxHeadStatusThread = Class (TThread)
fOwner : TG6BXTarget;
fHeadStatus : TG6BxHeadStatus; (** TPersistent **)
procedure Execute; override;
public
constructor Create (AOwner: TG6BXTarget; AHeadStatus : TG6BxHeadStatus);
destructor Destroy; override;
end;
(******************************************************************************)
(******************************************************************************)
(** TG6BxWorkerThread **)
(******************************************************************************)
(******************************************************************************)
constructor TG6BxHeadStatusThread.Create (AOwner: TG6BXTarget; AHeadStatus : TG6BxHeadStatus);
begin
inherited Create(False);
fHeadStatus := TG6BxHeadStatus.Create;
fHeadStatus.Assign(AHeadStatus);
(** Init **)
FOwner := AOwner;
Self.FreeOnTerminate := True;
end;
(******************************************************************************)
destructor TG6BxHeadStatusThread.Destroy;
begin
FreeAndNil(fHeadStatus);
inherited Destroy;
end;
(******************************************************************************)
procedure TG6BxHeadStatusThread.Execute;
begin
synchronize(procedure
begin
if fOwner <> nil then fOwner.UpdateExternalHeadStatus(fHeadStatus);
end
);
end;