AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Thread - ist das sauberer Code?!

Ein Thema von FAM · begonnen am 18. Feb 2015 · letzter Beitrag vom 18. Feb 2015
Antwort Antwort
Seite 1 von 2  1 2   
FAM

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

Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 08: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
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 08:30
Ich würde einen Thread niemals über einen Timer aus dem Hauptthread aus aufrufen. Stattdessen würde ich eine while-not-terminated-Schleife im Thread-Executeteil machen. Dort würde ich ein EventWait.WaitFor einbauen, das wie ein Timer wirkt.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
FAM

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

AW: Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 08:35
Ich würde einen Thread niemals über einen Timer aus dem Hauptthread aus aufrufen. Stattdessen würde ich eine while-not-terminated-Schleife im Thread-Executeteil machen. Dort würde ich ein EventWait.WaitFor einbauen, das wie ein Timer wirkt.
Aus welchen Grund würdest du nie einen Timer dafür benutzen?
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 08:47
Warum sollte sich der Hauptthread unnötig mit einem unabhängigen Neben-Thread beschäftigen.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
FAM

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

AW: Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 09:06
Dort würde ich ein EventWait.WaitFor einbauen, das wie ein Timer wirkt.

so?

Delphi-Quellcode:

procedure TLivedataThread.Execute;
var
  i: integer;
begin

  inherited;

  while not Terminated do
  begin

    // Invoke terminate, then call abort funtion
    if Self.Terminated then
    begin

      // call abort-function

      // Exit
      Exit;

    end;


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

    Sleep(2000);

  end;

end;
aber damit könnte ich den Thread nie von aussen beenden?!

Geändert von FAM (18. Feb 2015 um 09:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 09:31
Delphi-Quellcode:
constructor TLivedataThread.Create(Callback: TLivedataCallback);
begin
  ...
  EventWait := TEvent.Create(nil,true,false,'');
end;

procedure TLivedataThread.Terminate;
begin
  EventWait.SetEvent;

  inherited;
end;

destructor TLivedataThread.Destroy;
begin
  EventWait.Free;

  inherited;
end;

procedure TLivedataThread.Execute;
begin
  while not Terminated do
  begin
  ...
    EventWait.WaitFor(30000);
  end;
end;
Und im Haupthread
Delphi-Quellcode:
  if Assigned(LivedataThread) then
  begin
    LivedataThread.Terminate;
    LivedataThread.WaitFor;
    FreeAndNil(LivedataThread);
  end;
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 09:35
Schau dir Delphi-Referenz durchsuchenTEvent an.

Im Übrigen läuft so ein Thread erst nach dem Erzeugen los - damit erübrigt sich auch das Erzeugen im Suspended Mode.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 09:40
@baumina

Wenn du eine kleine Änderung vornimmst
Delphi-Quellcode:
destructor TLivedataThread.Destroy;
begin
  Terminate;
  EventWait.SetEvent;

  inherited;
  EventWait.Free;
end;
dann reicht ein simples
FreeAndNil( LiveDataThread ); bzw. wenn man die protected Methode TThread.TerminatedSet überschreibt mit
Delphi-Quellcode:
procedure TLivedateThread.TerminatedSet;
begin
  inherited;
  EventWait.SetEvent;
end;

destructor TLivedataThread.Destroy;
begin

  inherited;
  EventWait.Free;
end;
dann wird es noch weniger Code
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 09:48
Danke Rufo, gefällt mir.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
FAM

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

AW: Thread - ist das sauberer Code?!

  Alt 18. Feb 2015, 10:45
Und im Haupthread
Delphi-Quellcode:
  if Assigned(LivedataThread) then
  begin
    LivedataThread.Terminate;
    LivedataThread.WaitFor;
    FreeAndNil(LivedataThread);
  end;
hmm, die zeilen verstehe ich nicht? kannst du die bitte einzeln erklären und warum auch in dieser reihenfolge
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf