Einzelnen Beitrag anzeigen

FAM

Registriert seit: 22. Dez 2014
47 Beiträge
 
Delphi XE Enterprise
 
#1

Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 07:16
Delphi-Version: 5
Hallo Zusammen,

habe eine Thread-Routine implementiert und frage mich jetzt ob das sauber geschrieben / ein sauberes Konzept ist.

Ich möchte zyklisch in einen ausgelagerten Thread bestimmte Business-Logik ausführen....

Thread-Lib

Delphi-Quellcode:

unit lib.livedata;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, event.types, DateUtils;

type

  // Ergebniswerte Callback
  TAsyncLivedataResult = record
    ErroText: String;
    ApplicationTimestamp: String;
    OPCConncetionTimestamp: String;
    ErrorCode: Integer; // Fehlercode im Fehlerfall, sonst 0 (=LIVEDATA_OK)
  end;

  TLivedataCallback = procedure(LivedataResult: TAsyncLivedataResult) of Object;

  TLivedataThread = class(TThread)
    FLivedataResult: TAsyncLivedataResult;
    FCallback: TLivedataCallback;

  protected
    procedure Execute; Override;
    procedure DoCallbackVCL;
  public
    constructor Create(Callback: TLivedataCallback); overload;
  end;

function ExecuteAsync(Callback: TLivedataCallback): Boolean;

implementation


  { EventTypes }

constructor TLivedataThread.Create(Callback: TLivedataCallback);
begin

  inherited Create(TRUE); // Thread gestoppt erzeugen
  FreeOnTerminate := TRUE;

  // Callback definieren
  FCallback := Callback;

  // Thread starten, ruft .Execute auf
  Suspended := FALSE;

end;

procedure TLivedataThread.DoCallbackVCL;
begin
  FCallback(FLivedataResult)
end;

procedure TLivedataThread.Execute;
begin

  // Code....
  
 
  // Callback
  if Assigned(FCallback) then // Callback-Funktion übergeben?
    Synchronize(DoCallbackVCL); // dann VCL-fähig ausführen

end;


function ExecuteAsync(Callback: TLivedataCallback): Boolean;
begin
  Result := TRUE;
  TLivedataThread.Create(Callback);
end;

end.
Benutzung der Lib in einer TTimer Komponente

Delphi-Quellcode:

...

uses
  // Livedata-Lib
  lib.Livedata

...

procedure TForm1.LivedataCallback(Result: TAsyncLivedataResult);
begin

  // foobar

end;

procedure TForm1.TimerRedundancyTimer(Sender: TObject);
begin
  // Aufruf Async Thread
  if lib.Livedata.ExecuteAsync(LivedataCallback) then
  begin
    // OK
  end
  else
    // Error

end;

habe das mal durch den Debugger laufen lassen, sieht erstmal OK aus. Im Interval (TTimer) wird der Async ausgeführt, die Frage ist nur ist das sauber oder würdet ihr das anders machen (z.b. Speicherfreigabe,...)?
  Mit Zitat antworten Zitat