AGB  ·  Datenschutz  ·  Impressum  







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

Frage zu Threads

Ein Thema von Rakshasa · begonnen am 26. Aug 2004 · letzter Beitrag vom 26. Aug 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Rakshasa
Rakshasa

Registriert seit: 1. Nov 2003
182 Beiträge
 
Delphi 2007 Professional
 
#1

Frage zu Threads

  Alt 26. Aug 2004, 17:30
Hi!!

Ich habe mir Luckie's geniales Thread Turtorial mal angeschaut und mir meinen Thread danach (so weit ich's verstanden habe .. gebastelt.

Frage an die Leute, die etwas mehr davon verstehen als ich:

Ist meine Art de Thread Aufrufs "richtig" (funktionieren tuts), ergo wird alles freigegeben was initialisiert wurde etc.?

Code:
type
  TMeinThread = class(TThread)
  protected
    procedure Execute; override;
  end;

...

procedure TMeinThread.Execute;
begin

  FreeOnTerminate:=True;
 ...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MeinThread: TMeinThread;
begin
  MeinThread:=TMeinThread.Create(False);
end;
Gerade nach dem .Create, muß ich da nicht irgendwie den Thread auflösen oder tut er das von selbst?! %-)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Frage zu Threads

  Alt 26. Aug 2004, 17:34
Ich würde das FreeOnTerminate in die ButtonClick Methode nehmen vor dem Erzeugen des Threads.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Fossibaer58809
Fossibaer58809

Registriert seit: 20. Aug 2004
Ort: Lüdenscheid
50 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Frage zu Threads

  Alt 26. Aug 2004, 17:41
Zitat von Luckie:
Ich würde das FreeOnTerminate in die ButtonClick Methode nehmen vor dem Erzeugen des Threads.
Wirklich vor dem Erzeugen

Gruß

Michael
Michael Küper
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Frage zu Threads

  Alt 26. Aug 2004, 17:43
Klar. Das Objekt MeinThread existiert doch schon.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Frage zu Threads

  Alt 26. Aug 2004, 17:44
Hi
Zitat von Rakshasa:
Gerade nach dem .Create, muß ich da nicht irgendwie den Thread auflösen oder tut er das von selbst?!
Da du FreeOnTerminate auf true setzt, gibt er sich selber frei, sobald die Execute-Methode beendet wird.

Allerdings wäre es sauberer das FreeOnTerminate entweder im ButtonClick zu setzen oder in einem überschriebenen Konstruktor im Thread-Objekt.

Setzen im OnClick:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  MeinThread: TMeinThread;
begin
  // Thread angehalten erzeugen, damit er nicht schon zu Ende ist, bevor FreeOnTerminate auf true gesetzt wurde
  MeinThread:=TMeinThread.Create(true);
  MeinThread.FreeOnTerminate := true;
  // Thread-Ausführung starten
  MeinThread.Resume;
end;
Außerdem ist die Variable MeinThread ein bisschen ungünstig deklariert, denn nach dem Ende von ButtonClick hast du keine Möglichkeit mehr, auf das Thread-Objekt zuzugreifen.

[EDIT] Execute in Resume geändert - hatte das Execute noch irgendwie im Hinterkopf ... [/EDIT]
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Frage zu Threads

  Alt 26. Aug 2004, 17:47
Man kann auch die Eigenschaften vor dem Aufruf der Methide Create setzten, dann spart man sich den Aufruf von Execute.

Und wenn er nicht mehr auf das Thread-Objekt zugreifen muss ist das doch kein Problem.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Fossibaer58809
Fossibaer58809

Registriert seit: 20. Aug 2004
Ort: Lüdenscheid
50 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Frage zu Threads

  Alt 26. Aug 2004, 17:49
Zitat von Luckie:
Klar. Das Objekt MeinThread existiert doch schon.
Ähmmm.. ich glaube ich muss meine Brille mal putzen
Aber ich sehe da nur eine nicht initialisierte Variable. Und wenn ich dann auf eine Eigenschaft zugreife gibts bei mir eine hübsche AV.

Michael
Michael Küper
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Frage zu Threads

  Alt 26. Aug 2004, 17:50
Mist, stimmt.

Aber starten tut man eine Thread mit 8oh]Resume[/oh]:
Delphi-Quellcode:
    // Thread pausiert erzeugen, um weiter Initialisierungen vornehmen zu können
    ThreadArray[Loop] := TMyThreads.Create(True);
    // Listviewzeilenindex übergeben
    ThreadArray[Loop].FIndex := Loop;
    // Priorität festlegen
    ThreadArray[Loop].Priority := tpIdle;
    // Thread gibt den Speicher, wenn er fertig ist selber wieder frei
    ThreadArray[Loop].FreeOnTerminate := True;
    // und los
    ThreadArray[Loop].Resume;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Fossibaer58809
Fossibaer58809

Registriert seit: 20. Aug 2004
Ort: Lüdenscheid
50 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Frage zu Threads

  Alt 26. Aug 2004, 17:54
Ich würde ganz einfach in der ja schon abgeleiteten Klasse TMeinThread den Konstruktor Create überschreiben und das FreeOnTerminate dort setzen. Dann kann ich den Thread starten ohne Ihn auf suspended zu setzen und brauch Ihn uach nicht mit resume starten.
Ob die Methode Execute aus dem MainThread aufgerufen werden kann ist mir gerade nicht bewusst. Doch könnte ich mir vorstellen, dass dann der Thread immer noch schön schläft und die Execute vom MainThread ausgeführt wird

Michael
Michael Küper
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Frage zu Threads

  Alt 26. Aug 2004, 17:57
Zitat von Fossibaer58809:
Ich würde ganz einfach in der ja schon abgeleiteten Klasse TMeinThread den Konstruktor Create überschreiben und das FreeOnTerminate dort setzen. Dann kann ich den Thread starten ohne Ihn auf suspended zu setzen und brauch Ihn uach nicht mit resume starten.
@Namensvetter: Das wäre die elegantere Methode.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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:55 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