Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread "warten" lassen? (https://www.delphipraxis.net/125626-thread-warten-lassen.html)

BloodySmartie 9. Dez 2008 09:16


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 :)

Meflin 9. Dez 2008 09:23

Re: Thread "warten" lassen?
 
Na klar ist das möglich, indem du einfach dein Threadproc irgendwie auf die Art implementierst:
Delphi-Quellcode:
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 die Abbruchbedingung wird eben genau dann erfüllt, wenn du den Abbruch veranlasst ;)

Und ja, es ist unperformant, 1000e Threads immer wieder neu zu erstellen, statt einen 1000 Aufgaben abarbeiten zu lassen!

sirius 9. Dez 2008 09:26

Re: Thread "warten" lassen?
 
Zitat:

Zitat von BloodySmartie
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?

Ja, ist möglich. Was aber nicht bedeutet, dass deine bisherige Vorgehensweise falsch o.ä. ist.

Wie macht man sowas?
  1. Du kannst den Thread mit einer Wait-function (waitforsingleobject, waitformultipleobject,...) warten lassen und ihn mittels Event aufwecken.
  2. Du kannst ein Fenster erzeugen (allocatehwnd) und den Thread mittels einer Message wecken, nachdem du ihn mit getmessage oder waitmessage hast schlafen gelegt
  3. eine Mischung aus obigen (MsgWaitforMultipleObject)

BloodySmartie 9. Dez 2008 09:29

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.

sirius 9. Dez 2008 09:34

Re: Thread "warten" lassen?
 
Nein, kein VCL-Event, sondern eins von Windows:
Hier im Forum suchenTEvent
Event Objects

BloodySmartie 9. Dez 2008 09:39

Re: Thread "warten" lassen?
 
Vielen Dank, da werd ich mich gleich mal durchforsten.

mirage228 9. Dez 2008 09:44

Re: Thread "warten" lassen?
 
Vielleicht reicht es dir ja den Thread selbst in den Stopp-Zustand zu versetzen, ala Delphi-Referenz durchsuchenTThread.Suspend (Delphi-Referenz durchsuchenTThread.Resume).

Viele Grüße

sirius 9. Dez 2008 10:19

Re: Thread "warten" lassen?
 
Zitat:

Zitat von mirage228
Vielleicht reicht es dir ja den Thread selbst in den Stopp-Zustand zu versetzen, ala Delphi-Referenz durchsuchenTThread.Suspend (Delphi-Referenz durchsuchenTThread.Resume).

Das ist nicht so gut, da du nie weist, wo der Thread grade ist.

BloodySmartie 9. Dez 2008 10:45

Re: Thread "warten" lassen?
 
Über Suspend würde ich vielleicht so rangehen:
Delphi-Quellcode:

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;
Und im Hauptprogramm:
Delphi-Quellcode:
//Daten verarbeiten:
myThread.myData:=WhatEver; //Zu verarbeitende Daten setzen
myThread.Resume; //Verarbeitung anstoßen

//Thread beenden:
myThread.terminate:=true
myThread.Resume;
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.

Sir Rufo 9. Dez 2008 10:52

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.
Seite 1 von 2  1 2      

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