AGB  ·  Datenschutz  ·  Impressum  







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

Thread mit timer gestartet

Ein Thema von akurka · begonnen am 27. Okt 2014 · letzter Beitrag vom 29. Okt 2014
Antwort Antwort
Seite 3 von 3     123   
Dejan Vu
(Gast)

n/a Beiträge
 
#21

AW: Thread mit timer gestartet

  Alt 27. Okt 2014, 17:13
Nein. Du kannst Sleep in einem Thread verwenden, auch wenn Du (natürlich indirekt, z.B. über Synchronize) auf GUI-Elemente aus dem Thread heraus zugreifst. Das macht überhaupt nichts.

Na ja, und so ein kleiner Backgroundworker in einem LOB-Tool, was man so mal eben schreibt, verletzt nur heimlich irgendwelche Designregeln. So zum runterschruppeln eines kleinen Tools ist das vollkommen ok.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#22

AW: Thread mit timer gestartet

  Alt 27. Okt 2014, 18:12
Hallo alle...
Ein Sleep im Thread ist zwar möglich, behindert im Normalfall auch nicht den Mainthread. Die Spreu trennt sich beim Beenden des MainThreads vom Weizen. Da wartet der Mainthread auf die Beendigung des Sleep des Threads...und der Benutzer wundert sich.

Lektüre für selbiges Problem:
http://www.delphipraxis.net/181596-p...m-tthread.html
einfache Lösung in #4

Geändert von haentschman (27. Okt 2014 um 18:15 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: Thread mit timer gestartet

  Alt 27. Okt 2014, 18:18
Hallo alle...
Ein Sleep im Thread ist zwar möglich, behindert im Normalfall auch nicht den Mainthread. Die Spreu trennt sich beim Beenden des MainThreads vom Weizen. Da wartet der Mainthread auf die Beendigung des Sleep des Threads...und der Benutzer wundert sich.

Lektüre für selbiges Problem:
http://www.delphipraxis.net/181596-p...m-tthread.html
einfache Lösung in #4
Kann man nicht Verallgemeinern..
Wie Medium schon schrieb!
Zitat:
Wobei ich es auch wieder in die Design-Problem Ecke stellen würde
Ist also von Fall zu Fall Unterschiedlich je nach gebrauch.
Ich würde es grundsätzlich verneinen. (Zumindest in meinem Fall)

gruss
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#24

AW: Thread mit timer gestartet

  Alt 27. Okt 2014, 18:28
Sinngemäß:

Delphi-Quellcode:
ThreadExecute;
while not Terminated then
begin
  // mach was
  Sleep(50000);
end;
Delphi-Quellcode:
procedure Form1.FormClose;
begin
  Thread.Terminate;
  Thread.Waitfor;
  Thread.Free; // wo auch immer.
end;
Frage: Wie lange dauert das Beenden?

PS: Wir sprechen nicht über Abwürgen sondern definiert Beenden.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#25

AW: Thread mit timer gestartet

  Alt 27. Okt 2014, 18:54
Geht irgendwie am Thema vorbei.
Ich sagte doch Verwendungsabhängig.

Ich habe ein Plugin System in dem die Plugins selbst das verhalten und Aktualisierung des Threads beeinflussen.
Was soll ich da mit einem Sleep? Das blockiert nur die Anwendung.
Die Plugins legen also fest mit welchen Intervall der Thread aktualisiert (Timer abhängig).
Wie das bei ihm ist entzieht sich meiner Kenntnis aber verallgemeinern kann man das nicht.

Sleep or not Sleep das ist hier die Frage!

gruss

Geändert von EWeiss (27. Okt 2014 um 18:56 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#26

AW: Thread mit timer gestartet

  Alt 27. Okt 2014, 19:04
Gut, in meinen Fällen bewegt sich die Wartezeit selten über 1000ms. Das ist in der Tat ein valides Problem. Aber auch "schmutzig" lösbar:
Delphi-Quellcode:
procedure TMyThread.Execute;
var
  timer: Integer;
begin
  repeat
    // Zeug
    timer := 0;
    repeat
      Sleep(100);
      inc(timer, 100);
    until (timer >= 1000) or Terminated;
  until Terminated;
end;
Nicht schön, aber möglich.

In meinem letzten Thread-intensiven Projekt habe ich es noch ein wenig anders: Es gibt einen Haupt-Workerthread, dessen Aufgabe es ist Jobs abzuarbeiten (Einträge in eine DB machen). Die Jobs fallen zyklisch an, wobei es mehrere verschiedene Zyklus-Gruppen gibt, die alle unterschiedliche Intervalle haben. Für jede Gruppe gibt es daher einen weiteren Thread, der einfach nur seine Wartezeit durch wartet, und dann dem Job-Thread signalisiert einen Job zu machen.
Delphi-Quellcode:
// "Timer-Thread"
proceudre TJobGroup.Execute;
begin
  repeat
    while ((GetTickCount-LastJobFired) < Interval) and (not Terminated) do
      Sleep(0);
    if not Terminated then
      SignalJob();
    LastJobFired := GetTickCount;
  until Terminated;
end;

// Job-Thread
procedure TJobs.Execute;
begin
  repeat
    while JobList.Count > 0 do
    begin
      DoStuff(JobList[0]);
      JobList.Delete(0);
    end;
    Sleep(0);
  until Terminated;
end;
(Das Sleep(0) sorgt dafür, dass der Thread immer mal wieder seine Time-Slices abgibt, und damit nicht immer maximale CPU Auslastung verursacht.)

Die JobList Zugriffe müssen natürlich durch eine CriticalSection gesichert werden. Aber das ist schon für ein recht großes Projekt, für ein Töölchen so nebenbei würde ich das so auch nicht machen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (27. Okt 2014 um 19:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#27

AW: Thread mit timer gestartet

  Alt 29. Okt 2014, 17:11
Hallo
Ich habe offenbar mit meinem Thema eine kontroverse Diskusion angeworfen.
Besten Dank für die vielen Beiträge, ich habe daraus einiges gelernt.
Die Verwendung von "sleep" in Threads ist u.U. doch nicht ganz harmlos.
Gruss Anton
Anton Kurka
  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 02:47 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