![]() |
Thread "warten" lassen?
Hallo zusammen!
Was ich im Moment über den Ablauf von Threads weiß, hält sich leider noch in zu engen Schranken. Bisher benutze ich sie in der Art, dass ich ein Objekt meiner Threadklasse erzeuge, welches dann ein einziges Mal die Execute-Methode durchlaufen lässt und sich anschließend wieder zerstört(FreeOnTerminate). Nun weiß ich zum Beispiel nicht, ob es effizient ist, genau auf diese Art und Weise viele Aufgaben pro Sekunde durch solche Threadobjekte erledigen zu lassen. Ist es beispielsweise möglich, einen Thread ein einziges Mal zu erzeugen und dann quasi immer wieder warten zu lassen, bis er etwas zu tun hat? Danke :) |
Re: Thread "warten" lassen?
Na klar ist das möglich, indem du einfach dein Threadproc irgendwie auf die Art implementierst:
Delphi-Quellcode:
Und die Abbruchbedingung wird eben genau dann erfüllt, wenn du den Abbruch veranlasst ;)
while not Abbruchbedingun do begin
// Prüfen obs was zu tun gibt und wenn ja dann tus Sleep(0) //oder auch andere Intervalle, je nachdem wie oft eben Daten zum verarbeiten anfallen end; Und ja, es ist unperformant, 1000e Threads immer wieder neu zu erstellen, statt einen 1000 Aufgaben abarbeiten zu lassen! |
Re: Thread "warten" lassen?
Zitat:
Wie macht man sowas?
|
Re: Thread "warten" lassen?
Ah, interessant. Wenn ich die erste Methode wähle, muss ich das Event dann selbst zur Thread-Klasse hinzufügen? Das einzige Event, dass ich "von Natur aus" finden kann, ist OnTerminate.
|
Re: Thread "warten" lassen?
|
Re: Thread "warten" lassen?
Vielen Dank, da werd ich mich gleich mal durchforsten.
|
Re: Thread "warten" lassen?
Vielleicht reicht es dir ja den Thread selbst in den Stopp-Zustand zu versetzen, ala
![]() ![]() Viele Grüße |
Re: Thread "warten" lassen?
Zitat:
|
Re: Thread "warten" lassen?
Über Suspend würde ich vielleicht so rangehen:
Delphi-Quellcode:
Und im Hauptprogramm:type TMyThread = class(TThread) private protected procedure Execute; override; public terminate:boolean; myData:TMyData; end; procedure TMyThread.Execute; begin while not terminate do begin doSomething(myData); self.Suspend; end; end;
Delphi-Quellcode:
Besonders sauber sieht das aber nicht aus - vor allem müsste ich vielleicht noch über MyThread.Suspended sicherstellen, dass der Thread nicht gerade dann noch beschäftigt ist, wenn ich schon wieder nen neuen Verarbeitungszyklus starten möchte.
//Daten verarbeiten:
myThread.myData:=WhatEver; //Zu verarbeitende Daten setzen myThread.Resume; //Verarbeitung anstoßen //Thread beenden: myThread.terminate:=true myThread.Resume; |
Re: Thread "warten" lassen?
Und wenn man an den Thread eine Liste dranhängt mit den zu verarbeitenden Daten?
Einfach in die WorkListe den Auftrag reinpacken egal, ob der Thread läuft oder nicht. Läuft der Thread, dann arbeitet er alles in der Liste ab. Läuft der Thread nicht, dann weckt das Einfügen in die WorkList den Thread wieder auf. Das wäre doch eigentlich die smarteste Lösung cu Oliver |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 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