AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread + Timer, Einbinden von TimerThread.pas

Ein Thema von MarLe · begonnen am 10. Sep 2014 · letzter Beitrag vom 3. Jan 2018
Antwort Antwort
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: Thread + Timer, Einbinden von TimerThread.pas

  Alt 3. Jan 2018, 14:16
Damit das mit dem Event auch klappt, habe ich folgende Zeile in der Hauptunit (Beitrag 2) eingefügt. Ansonsten kann ich Event in einer Ableitung nicht sehen.
Delphi-Quellcode:
public
 property Event: TEvent read FEvent write FEvent;
ExecuteTimed also. Ok. Ich habe währenddessen ein bisschen rumprobiert um zu sehen wie der Thread reagiert je nachdem was ich mache.
Mit dem Event-Property funktioniert dann auch das hier
Delphi-Quellcode:
procedure TTestThread.ExecuteTimed;
var
 res: TWaitResult;
begin
 while not Terminated do
  begin
   res := Event.WaitFor(Interval); // also z.B. 1000

   case res of
    wrSignaled:
     TThread.Synchronize(nil,
       procedure
      begin
       showmessage('Signaled'); // Wird beispielsweise aufgerufen, wenn ich außen <Thread-Instanz>.Terminate; ausführe
      end);
    wrTimeout:
     TThread.Synchronize(nil,
      procedure
      begin
       showmessage('Timeout'); // Wird immer aufgerufen, wenn oben das WaitFor vorbei ist AUßER es gab vorher wrSignaled, wrAbandoned oder wrError.
      end);
    wrAbandoned:
     Terminate;
    wrError: {Fehler loggen}
     ;
   end;
  end;

 TThread.Synchronize(nil,
  procedure
  begin
   showmessage('Thread Ende');
  end);
end;
Was genau wrSignaled macht habe ich aber noch nicht herausgefunden.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Thread + Timer, Einbinden von TimerThread.pas

  Alt 3. Jan 2018, 14:20
jetzt hast du 2 mal eine Schleife die auf Terminated wartet.
Im execute und im ExecuteTimed.
Vergiss doch einfach den Event im ExecuteTimed, oder noch besser versuche zu verstehen was Deine ThreadKlasse wirklich macht....
Fritz Westermann
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Thread + Timer, Einbinden von TimerThread.pas

  Alt 3. Jan 2018, 14:24
Ich denke ich habs jetzt raus.
Das while in override ExecuteTimed muss natürlich raus weil das TCustomThread.Execute; in einer Schleife ja auch immer ExecuteTimed aufruft.
Nun funktioniert auch Enabled richtig.

Zitat:
Vergiss doch einfach den Event im ExecuteTimed
Wie soll ich denn das Event vergessen. Braucht man das im eigenen Thread, also der Ableitung, im ExecuteTimed gar nicht?

Dann wird Beitrag 18 vermutlich falsch sein
http://www.delphipraxis.net/1390098-post18.html
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Thread + Timer, Einbinden von TimerThread.pas

  Alt 3. Jan 2018, 14:29
Zitat:
Wie soll ich denn das Event vergessen. Braucht man das im eigenen Thread, also der Ableitung, im ExecuteTimed gar nicht?
Nein brauchst Du nicht, das ist ja der Witz and der Klasse.
Du machst eine Ableitung,
überschreibst ExecuteTimed und gut ist. Im alles andere kümmert sich die Thread-Klasse
Fritz Westermann
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Thread + Timer, Einbinden von TimerThread.pas

  Alt 3. Jan 2018, 14:39
Zitat:
Aufgeweckt wird der Thread entweder wenn TimeOut aufgetreten ist oder wenn mit SetEvent der Event gesetzt wird (extern oder ggf. im Destructor)
Von Außen kann man den Thread leider nur aufwecken, wenn man folgende Änderungen in der Unit vornimmt

Delphi-Quellcode:
public
 property Event: TEvent read FEvent write FEvent; // Damit man Event von Außen überhaupt sieht
Und in TCustomThread.Execute
Delphi-Quellcode:
// Aus
if FEvent.WaitFor(LInterval) = TWaitResult.wrTimeout then

// wird
if FEvent.WaitFor(LInterval) in [TWaitResult.wrTimeout, TWaitResult.wrSignaled] then
Nur bin ich mir bei der letzten Zeile nicht so sicher, ob das OK ist.

Von Außen kann man dann aufrufen TestThread.Event.SetEvent;
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Thread + Timer, Einbinden von TimerThread.pas

  Alt 3. Jan 2018, 14:45
if FEvent.WaitFor(LInterval) in [TWaitResult.wrTimeout, TWaitResult.wrSignaled] then Das ist Ok, aber den Event ohne Setter und Getter sichtbar machen nicht.

Lass das weg und benutze im code doch einfach das Enabled Property, da wird der Event auch ausgelöst. (Threadsafe)
Fritz Westermann
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Thread + Timer, Einbinden von TimerThread.pas

  Alt 3. Jan 2018, 14:48
Wenn ich aber das Property Enabled verwende, hat das nicht denselben Zweck.

SetEvent bräuchte ich, um sofort aus dem WaitFor rauszukommen und alles weitere in ExecuteTimed auszuführen.

Enabled auf False stellen würde WaitFor für INFINITE lang im Kreis rennen lassen.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.158 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Thread + Timer, Einbinden von TimerThread.pas

  Alt 3. Jan 2018, 14:54
Wenn ich aber das Property Enabled verwende, hat das nicht denselben Zweck.

SetEvent bräuchte ich, um sofort aus dem WaitFor rauszukommen und alles weitere in ExecuteTimed auszuführen.

Enabled auf False stellen würde WaitFor für INFINITE lang im Kreis rennen lassen.
Sorry, aber langsam wird es anstrengend... Versuch doch einfach aufgrund meines alten postings zu verstehen, wie es funktioniert und setzt dann einfach das Timeout nicht auf Infinite sondern auf den Wert den Du brauchst... Fertig.
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Thread + Timer, Einbinden von TimerThread.pas

  Alt 3. Jan 2018, 15:02
Zum Glück seid ihr keine Lehrer. Denn sonst hättet ihr mit circa 90% solcher Idioten zu tun wie ich
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:43 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