AGB  ·  Datenschutz  ·  Impressum  







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

Thread "warten" lassen?

Ein Thema von BloodySmartie · begonnen am 9. Dez 2008 · letzter Beitrag vom 9. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
BloodySmartie
(Gast)

n/a Beiträge
 
#1

Thread "warten" lassen?

  Alt 9. Dez 2008, 10:16
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
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#2

Re: Thread "warten" lassen?

  Alt 9. Dez 2008, 10:23
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!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Thread "warten" lassen?

  Alt 9. Dez 2008, 10:26
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)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
BloodySmartie
(Gast)

n/a Beiträge
 
#4

Re: Thread "warten" lassen?

  Alt 9. Dez 2008, 10:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Thread "warten" lassen?

  Alt 9. Dez 2008, 10:34
Nein, kein VCL-Event, sondern eins von Windows:
Hier im Forum suchenTEvent
Event Objects
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
BloodySmartie
(Gast)

n/a Beiträge
 
#6

Re: Thread "warten" lassen?

  Alt 9. Dez 2008, 10:39
Vielen Dank, da werd ich mich gleich mal durchforsten.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Thread "warten" lassen?

  Alt 9. Dez 2008, 10:44
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Thread "warten" lassen?

  Alt 9. Dez 2008, 11:19
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
BloodySmartie
(Gast)

n/a Beiträge
 
#9

Re: Thread "warten" lassen?

  Alt 9. Dez 2008, 11:45
Ü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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

Re: Thread "warten" lassen?

  Alt 9. Dez 2008, 11:52
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:48 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