![]() |
Delphi-Version: XE
Polling im TThread
Hallo alle... 8-)
Die "Anweisungen" sollen im Thread aller z.B. 10 Sekunden ausgeführt werden. Ein beherztes Sleep im Execute hat die gleiche Auswirkung. Nur wenn der Thread von Außen terminated wird dauert es ebenfalls 10 Sekunden bis zum Beenden was nicht gewünscht ist. ...ein Timer ist keine gute Wahl.:roll: PS: Diese "Aufgabe" habe ich zum ersten Mal. Lösungsvorschläge? :wink: (mal sehen ob ihr bessere habt 8-)) Ergänzung zu ![]() |
AW: Polling im TThread
Ein Event vielleicht, wo man 10 Sekunden wartet ob er auslöst und wenn nicht, dann die Aktion ausführt?
|
AW: Polling im TThread
Das entspricht ja der 2. Variante aus dem verlinkten Beitrag. Ich halte das auch für die richtige Lösung.
|
AW: Polling im TThread
Danke für deine Antwort. Event...wie meinst du das?
mein Vorschlag:
Delphi-Quellcode:
...auf die 100 ms "Versatz" kann man verzichten.
procedure TWorkerPolling.Execute;
var StartCount: Cardinal; CurrentCount: Cardinal; begin inherited; StartCount:= 0; while not Terminated do begin CurrentCount:= GetTickCount; if (CurrentCount - StartCount) > conPollingInterval then // conPollingInterval = 10000 begin // auszuführender Code StartCount:= CetTickCount; end; Sleep(100); // für Leerlauf end; end; Zitat:
|
AW: Polling im TThread
Zitat:
![]() Deine Variante geht natürlich auch, ist aber im Grunde busy-waiting und daher unschöner. |
AW: Polling im TThread
:P ok...das nächste Mal drücke ich mich geschickter aus. Events benutzte ich reichlich weil ich weis wie es geht... :cheer: Nur im Zusammenhang mit Thread und Auslösen / Warten stand ich auf dem Schlauch...
|
AW: Polling im TThread
Den Event beim
Delphi-Quellcode:
auslösen geht am elegantesten, wenn man
Terminate
Delphi-Quellcode:
überschreibt.
DoTerminate
|
AW: Polling im TThread
Zitat:
Zitat:
|
AW: Polling im TThread
Zitat:
Beides ist aber völlig unnötig, weil das Betriebssystem in Form von Events bereits eine perfekte Lösung anbietet. |
AW: Polling im TThread
Das einfachste und beste Beispiel, für das eben Genannte, ist die Delay-Funktion von Hagen.
|
AW: Polling im TThread
Zitat:
Delphi-Quellcode:
wird aufgerufen, wenn das Terminieren (Beenden) beginnt -> die Execute-methode verlassen wurde.
DoTerminate
Delphi-Quellcode:
ist da wesentlich geschickter :)
TerminatedSet
|
AW: Polling im TThread
Zitat:
|
AW: Polling im TThread
Das ist mit dem Event gemeint:
Delphi-Quellcode:
Allerdings gibt es dieses
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. ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 Uhr. |
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