Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Polling im TThread (https://www.delphipraxis.net/181596-polling-im-tthread.html)

Sir Rufo 27. Aug 2014 21:54

AW: Polling im TThread
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1270044)
Den Event beim
Delphi-Quellcode:
Terminate
auslösen geht am elegantesten, wenn man
Delphi-Quellcode:
DoTerminate
überschreibt.

Öhm, wenn du damit mal nicht auf die Nase fällst, denn
Delphi-Quellcode:
DoTerminate
wird aufgerufen, wenn das Terminieren (Beenden) beginnt -> die Execute-methode verlassen wurde.

Delphi-Quellcode:
TerminatedSet
ist da wesentlich geschickter :)

Uwe Raabe 27. Aug 2014 23:28

AW: Polling im TThread
 
Zitat:

Zitat von Sir Rufo (Beitrag 1270052)
Delphi-Quellcode:
TerminatedSet
ist da wesentlich geschickter :)

Die hatte ich auch eigentlich gemeint - beim Tippen stand der Editor halt grad auf der falschen Methode. Ich weiß nur nicht, ob es die in XE schon gab.

Sir Rufo 28. Aug 2014 09:41

AW: Polling im TThread
 
Das ist mit dem Event gemeint:
Delphi-Quellcode:
unit TimerThread;

interface

uses
  System.Classes,
  System.SyncObjs;

const
  TIMERTHREAD_INTERVAL_DEFAULT = 1000;
  TIMERTHREAD_ENABLED_DEFAULT = True;

type
  TTimerThread = class( TThread )
  private
    FCS : TCriticalSection;
    FEvent : TEvent;
    FInterval : Cardinal;
    FEnabled : Boolean;
    procedure SetInterval( const Value : Cardinal );
    function GetInterval : Cardinal;
    procedure SetEnabled( const Value : Boolean );
    function GetEnabled : Boolean;
  protected
    procedure Execute; override; final;
    procedure ExecuteTimed; virtual;
    // ACHTUNG! Das gibt es erst ab Delphi XE2
    procedure TerminatedSet; override;
  public
    constructor Create;
    destructor Destroy; override;

    property Interval : Cardinal read GetInterval write SetInterval default TIMERTHREAD_INTERVAL_DEFAULT;
    property Enabled : Boolean read GetEnabled write SetEnabled default TIMERTHREAD_ENABLED_DEFAULT;
  end;

implementation

{ TTimerThread }

constructor TTimerThread.Create;
begin
  FCS := TCriticalSection.Create;
  FEvent := TEvent.Create( nil, False, False, '' );
  inherited Create( False );
  FInterval := TIMERTHREAD_INTERVAL_DEFAULT;
end;

destructor TTimerThread.Destroy;
begin

  inherited;
  FEvent.Free;
  FCS.Free;
end;

procedure TTimerThread.Execute;
var
  LInterval : Cardinal;
begin
  inherited;
  while not Terminated do
    begin
      if Enabled then
        LInterval := Interval
      else
        LInterval := INFINITE;

      if FEvent.WaitFor( Interval ) = TWaitResult.wrTimeout
      then
        ExecuteTimed;
    end;
end;

procedure TTimerThread.ExecuteTimed;
begin

end;

function TTimerThread.GetEnabled : Boolean;
begin
  FCS.Enter;
  try
    Result := FEnabled;
  finally
    FCS.Leave;
  end;
end;

function TTimerThread.GetInterval : Cardinal;
begin
  FCS.Enter;
  try
    Result := FInterval;
  finally
    FCS.Leave;
  end;
end;

procedure TTimerThread.SetEnabled( const Value : Boolean );
begin
  FCS.Enter;
  try
    FEnabled := Value;
  finally
    FCS.Leave;
  end;
end;

procedure TTimerThread.SetInterval( const Value : Cardinal );
begin
  FCS.Enter;
  try
    FInterval := Value;
    FEvent.SetEvent;
  finally
    FCS.Leave;
  end;
end;

procedure TTimerThread.TerminatedSet;
begin
  inherited;
  FEvent.SetEvent;
end;

end.
Allerdings gibt es dieses Delphi-Referenz durchsuchenTThread.TerminatedSet erst ab Delphi XE2 und für die Funktion unerlässlich. Einen Workaround für alles kleiner XE2 habe ich gerade nicht zur Hand.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz