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. |
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 |
AW: Thread mit timer gestartet
Zitat:
Wie Medium schon schrieb! Zitat:
Ich würde es grundsätzlich verneinen. (Zumindest in meinem Fall) gruss |
AW: Thread mit timer gestartet
Sinngemäß:
Delphi-Quellcode:
ThreadExecute;
while not Terminated then begin // mach was Sleep(50000); end;
Delphi-Quellcode:
Frage: Wie lange dauert das Beenden?
procedure Form1.FormClose;
begin Thread.Terminate; Thread.Waitfor; Thread.Free; // wo auch immer. end; PS: Wir sprechen nicht über Abwürgen sondern definiert Beenden. :zwinker: |
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 |
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:
Nicht schön, aber möglich.
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; 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:
(Das Sleep(0) sorgt dafür, dass der Thread immer mal wieder seine Time-Slices abgibt, und damit nicht immer maximale CPU Auslastung verursacht.)
// "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; 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. |
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. |
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