Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Thread mit timer gestartet (https://www.delphipraxis.net/182462-thread-mit-timer-gestartet.html)

Dejan Vu 27. Okt 2014 16:13

AW: Thread mit timer gestartet
 
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.

haentschman 27. Okt 2014 17:12

AW: Thread mit timer gestartet
 
Hallo alle... :hi:
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. :P

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

EWeiss 27. Okt 2014 17:18

AW: Thread mit timer gestartet
 
Zitat:

Zitat von haentschman (Beitrag 1277577)
Hallo alle... :hi:
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. :P

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

haentschman 27. Okt 2014 17:28

AW: Thread mit timer gestartet
 
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. :zwinker:

EWeiss 27. Okt 2014 17:54

AW: Thread mit timer gestartet
 
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

Medium 27. Okt 2014 18:04

AW: Thread mit timer gestartet
 
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.

akurka 29. Okt 2014 16:11

AW: Thread mit timer gestartet
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr.
Seite 3 von 3     123   

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