AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Thread soll eine Minute warten: Sleep oder Timer?
Thema durchsuchen
Ansicht
Themen-Optionen

Thread soll eine Minute warten: Sleep oder Timer?

Ein Thema von Bbommel · begonnen am 2. Feb 2009 · letzter Beitrag vom 13. Mär 2021
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: Thread soll eine Minute warten: Sleep oder Timer?

  Alt 2. Feb 2009, 20:42
Zitat von Dezipaitor:
Sowas?
Ähm...Das war meine erste Antwort
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#22

Re: Thread soll eine Minute warten: Sleep oder Timer?

  Alt 2. Feb 2009, 20:49
Dein Edit habe ich nicht mehr gelesen.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#23

Re: Thread soll eine Minute warten: Sleep oder Timer?

  Alt 3. Feb 2009, 08:16
Hallo zusammen,

Danke euch allen für die Anregungen und auch die Diskussionen - das alles hat mir nicht nur für die eigentliche Umsetzung, sondern auch für das Wissen, warum ich das eigentlich tue, weitergeholfen.

Einen hab ich aber noch. Am Anfang hatte ich selbst noch eine Lösung vorgeschlagen, auf die niemand weiter eingegangen ist (wie gemein... ). Das war der Ansatz, in dem sich der Thread am Ende mit Suspend selbst Schlafen gelegt hat und dann von außen wieder durch einen Timer aufgeweckt wurde. Wenn man das mit den anderen Beiträgen hier vergleicht, ist das ja fast so eine Art Zwischending zwischen dem Vorschlag von sirius (und anderen) und Frederika. Ist an dem Ansatz etwas wirklich falsch? Ist ein Timer ineffektiver als ein WaitFor? Oder ist er einfach nur unschön oder ungewöhnlich?

Bis denn
Bommel
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#24

Re: Thread soll eine Minute warten: Sleep oder Timer?

  Alt 3. Feb 2009, 09:59
Hallo Sirius, hallo zusammen,

eine Nachfrage habe ich noch zu deinem Ansatz.

Zitat von sirius:
Delphi-Quellcode:
constructor Tmythread.Create(CreateSuspended: Boolean);
begin
  inherited Create(false); // <----- muss das wirklich "false" sein?
  FEvent:=TEvent.Create(nil,true,false,'');
end;

[...]

procedure Tmythread.execute;
begin
  while not terminated do
  begin
    DoSomething;
    FEvent.ResetEvent; // <----- ist das hier wirklich sinnvoll?
    FEvent.WaitFor(10000);
  end;
end;
Es geht mir um die markierten Stellen:

1. Create: Du rufst den Vorgänger immer mit "false" auf - machst du das, weil sonst die Gefahr besteht, dass das Execute schon losrennt, bevor das Create durch ist? Das heißt, wenn ich will, dass der Parameter noch weiter beachtet wird, müsste das Create vollständig so aussehen:
Delphi-Quellcode:
constructor Tmythread.Create(CreateSuspended: Boolean);
begin
  inherited Create(false);
  FEvent:=TEvent.Create(nil,true,false,'');

  if not CreateSuspended then
    Resume;
end;
Edit: Da hatte ich wohl Tomaten auf die Augens und true und false verwechselt - Die richtige Frage wäre also: Warum startest du den Thread IMMER als nicht-suspended?

2. ResetEvent: Ist das nicht eher störend? Das Event startet doch durch die Parameter bei Create eh als nicht gesetzt. Durch dieses Reset könnte doch nun folgendes passieren: Nehmen wir an, DoSomething dauert ein paar Sekunden (eben jene Datenbank-Abfrage beispielsweise) und während diese DoSomething läuft, wird der Thread terminiert und damit das Event gesetzt. Nach dem DoSomething wird es aber erst mal zurückgesetzt, was bedeutet, dass noch mal 10 Sekunden lang ein WaitFor aufgerufen wird, obwohl man das eigentlich gar nicht mehr braucht. Oder? Mein (sinnloser) Demo-Thread funktioniert jedenfalls auch ohne das Reset genau wie gewünscht.

Verzeiht meine vielen Nachfragen. Wie gesagt, ich bin halt noch neu im Thema Threads und möchte so gut wie möglich verstehen, was ich da tue, bevor ich das in Produktiv-Systeme einbaue.

Bis denn
Bommel
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#25

Re: Thread soll eine Minute warten: Sleep oder Timer?

  Alt 3. Feb 2009, 10:01
Suspend und Resume sollte man nicht verwenden (wird zwar intern von TThread verwendet, aber egal). Ist laut msdn auch nur für das Debuggen von Processen und Threads gedacht.
Zitat von msdn:
[SuspendThread]
This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization. ...
Das Waitfor bzw. die vernwednete Klasse TEvent, entspricht der Idee ein Ereignis zu setzen und mit Waitforsingleobject auf das Ereignis oder die verstrichene Zeit zu warten. TEvent kapselt die Funktionen der WinAPI (u.a. waitforsingleobject wird zur Methode TEvent.WaitFor)
Der Vorschlag mit dem Timer ist, dass du jedesmal einen neuen Thread und damit eine neue Verbindung aufbaust.

[roter Kasten] lese ich mir gleich durch


Edit: zum roten Kasten (letzter Beitrag)
Punkt 1. Jep das war falsch. das muss inherited Create(CreateSupended) hin. Der Thread wird so oder so fühestens erst nach dem Constructor gestartet.

Punkt 2. Hmm ja, müsste man nochmal genauer drüber nachdenken. bzw. wenn ich nochmal drüber nachdenke --> ja kann man streichen. Ich arbeite häufig mit mehreren Events, und da muss ich hin und wieder zurücksetzen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#26

Re: Thread soll eine Minute warten: Sleep oder Timer?

  Alt 3. Feb 2009, 10:20
Alles klar. Vielen Dank noch mal, jetzt kann es dann so langsam ans echte Projekt gehen.
  Mit Zitat antworten Zitat
Stefan1286b

Registriert seit: 6. Jan 2012
Ort: Dinklage
25 Beiträge
 
Delphi 11 Alexandria
 
#27

AW: Thread soll eine Minute warten: Sleep oder Timer?

  Alt 13. Mär 2021, 17:59
Das Thema ist schon etwas älter aber ich habe es so gelöst:

Code:
constructor TBThread.Create;
begin
  inherited Create(true);
  FTerminateEvent := CreateEvent(nil, true, False, nil);
end;

destructor TBThread.Destroy;
begin
  SetEvent(FTerminateEvent);
  CloseHandle(FTerminateEvent);
  inherited;
end;

procedure TBThread.Execute;
begin
  while not Terminated do
  begin
      if WaitForSingleObject(FTerminateEvent, fcint) = WAIT_TIMEOUT then
    begin
      if not Terminated then
        DoSomething;
    end;
  end;
end;

procedure TBThread.TerminatedSet;
begin
  inherited;
  SetEvent(FTerminateEvent);
end;
fcint ist die Zeit die der Thread warten soll.
Und durch dass Event welches durch die überschriebene Methode TerminatedSet gesetzt wird wird das warten vorzeitig beendet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 06:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz