AGB  ·  Datenschutz  ·  Impressum  







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

Thread beenden oder warten lassen?

Ein Thema von naridian · begonnen am 17. Mär 2007 · letzter Beitrag vom 18. Mär 2007
Antwort Antwort
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#1

Thread beenden oder warten lassen?

  Alt 17. Mär 2007, 23:44
Mein Programm läd via Indy HTTP.Post Dateien ins Inet und damit es wärend dem Upload nicht tot ist hab ich das Hochladen der Dateien in einen Thread gepackt. Das funktioniert auch. Mein Programm soll alle paar Sekunden eine Datei hochladen. Meine Frage ist jetzt:
Wie mache ich das speichermäßig richtig? Soll ich einfach bei jeder hochzuladenden Datei wieder mit Create einen Thread aufmachen der sich dann nach execute (also hochladen) selbst beendet? Muss ich in dem Fall den Speicher danach irgendwie freigeben oder passiert das automatisch?
Oder macht man nur einmal am Anfang des Programmablaufs den Thread auf und lässt ihn dann irgendwie warten bis wieder eine neue Datei hochgeladen werden soll? Wie kann man in dem Fall einen Thread so lange warten lassen ohne Rechenzeit zu verbrauchen?

Gruß, Moritz
  Mit Zitat antworten Zitat
Benutzerbild von richie
richie

Registriert seit: 21. Apr 2006
Ort: Dresden
127 Beiträge
 
#2

Re: Thread beenden oder warten lassen?

  Alt 17. Mär 2007, 23:52
Also du kannst beides machen (ich geh jetzt mal davon aus, dass du von TThread ableitest). Ob es da speichermäßig einen Unterschied gibt, weiß ich nicht genau. Da ja immer nur ein Thread läuft, wird sich das sicherlich nicht viel nehmen.

Zitat:
Muss ich in dem Fall den Speicher danach irgendwie freigeben oder passiert das automatisch?
Also den Speicher musst du natürlich freigeben. Entweder du machst das mit Free selbst, oder du setzt im angehaltenen Zustand Delphi-Referenz durchsuchenFreeOnTerminate.

Zitat:
Wie kann man in dem Fall einen Thread so lange warten lassen ohne Rechenzeit zu verbrauchen?
Also du kannst einen Thread mit Delphi-Referenz durchsuchenSuspend warten lassen. Um ihn dann wieder anzustoßen, nimmst du Delphi-Referenz durchsuchenResume.
Robert
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Thread beenden oder warten lassen?

  Alt 18. Mär 2007, 00:09
Danke. Jep ich leite von TThread ab.

Wenn ich bei einem Thread bleiben will müsste ich dann also innerhalb der Execute Routine den eigenen Thread in den Ruhezustand schicken und von außerhalb wenns wieder was zu tun gibt wieder aufwecken. Weil Execute lässt sich ja nicht noch einmal aufrufen. Wenn aber ein Thread nach Ende von execute zu nichts mehr zu gebrauchen ist frage ich mich warum dann Freeonterminate ausschaltbar ist. Das Gegenteil macht doch dann keinen Sinn oder? Oder bleibt er dann beim selben Speicherraum wenn man erneut create aufruft? Würde gerne noch wissen was Speichermäßig ideal ist.
  Mit Zitat antworten Zitat
Benutzerbild von richie
richie

Registriert seit: 21. Apr 2006
Ort: Dresden
127 Beiträge
 
#4

Re: Thread beenden oder warten lassen?

  Alt 18. Mär 2007, 00:38
Zitat:
Wenn ich bei einem Thread bleiben will müsste ich dann also innerhalb der Execute Routine den eigenen Thread in den Ruhezustand schicken und von außerhalb wenns wieder was zu tun gibt wieder aufwecken.
Das ist richtig.

Zitat:
Weil Execute lässt sich ja nicht noch einmal aufrufen. Wenn aber ein Thread nach Ende von execute zu nichts mehr zu gebrauchen ist frage ich mich warum dann Freeonterminate ausschaltbar ist.
Tja, das weiß ich nicht, aber wenn du eine Antwort hast, vergiss nicht, sie hier zu posten!

Zitat:
Oder bleibt er dann beim selben Speicherraum wenn man erneut create aufruft?
Auch hier bin ich mir nicht 100%-ig sicher, aber wenn der Speicher noch belegt ist, kann er ja schlecht neu zugewiesen werden.
Robert
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Thread beenden oder warten lassen?

  Alt 18. Mär 2007, 01:41
Moin Robert,

Zitat von richie:
Tja, das weiß ich nicht, aber wenn du eine Antwort hast, vergiss nicht, sie hier zu posten!
ich hätte da eine:
Wenn man das Threadobjekt selber freigeben will, vor allem mit FreeAndNil, wäre eine FreeOnTerminate unpraktisch
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Thread beenden oder warten lassen?

  Alt 18. Mär 2007, 13:34
christian, soll ich jetzt den thread schlafen schicken oder jedes mal nen neuen createn?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Thread beenden oder warten lassen?

  Alt 18. Mär 2007, 14:00
Moin Moritz,

ich hätte da noch eine dritte Variante anzubieten.

Du schreibst in Deinem Hauptprogramm die Pfade in eine Liste (z.B. TStringList), die der Thread abfragt, und nach der Verarbeitung aus der Liste löscht. Der Zugriff sollte dann aber per Synchronize erfolgen.
Nach der Verarbeitung legt sich der Thread dann selber für eine gewisse Zeit schlafen, z.B. mit Sleep, und prüft anschliessend, ob noch eine Datei vorhanden ist.
Beenden kann man den Thread dann, indem man ihm ein Eigenschaft "spendiert", über die dem Thread mitgeteilt wird, dass er sich beenden soll.
Ob der Thread nun je Durchlauf immer eine Datei verarbeitet, oder sich erst schlafenlegt, wenn keine Datei mehr in der Liste vorhanden ist, hängt dann von Deinem Anwendungsfall ab.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von richie
richie

Registriert seit: 21. Apr 2006
Ort: Dresden
127 Beiträge
 
#8

Re: Thread beenden oder warten lassen?

  Alt 18. Mär 2007, 17:40
Zitat von Christian Seehase:
Beenden kann man den Thread dann, indem man ihm ein Eigenschaft "spendiert", über die dem Thread mitgeteilt wird, dass er sich beenden soll.
Diese Eigenschaft gibt es bereits:

Zitat von OH:
Die Methode Execute des Threads sollte ebenso wie alle Methoden, die von Execute aufgerufen werden, die Eigenschaft Terminated abfragen und gegebenenfalls die Ausführung beenden. Die Methode Terminate setzt die Eigenschaft Terminated auf true.

Terminate bietet ein Verfahren, einen Thread kontrolliert abzubrechen, wobei allerdings die Kooperation des Execute-Codes Voraussetzung ist.

naridian: Ich persönlich würde die Methode des immer wieder Neuerzeugens bevorzugen, da das doch am leichtesten machbar ist. Halt immer die Datei mit angeben, Thread ausführen (vorher FreeOnTerminate setzen), und die Execute-Methode einmal durchlaufen lassen.
Robert
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:30 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