Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Verwaltung von unbestimmter Anzahl Threads (https://www.delphipraxis.net/166195-verwaltung-von-unbestimmter-anzahl-threads.html)

MiKaEr 2. Feb 2012 14:07

Verwaltung von unbestimmter Anzahl Threads
 
hallo,

welches ist eine optimale methode, um eine unbestimmte anzahl an threads zu verwalten?

es kann ein thread sein, es könnern aber auch zehn sein.

ich hatte ein eine ObejctList gedacht. im Create der liste erzeuge ich den thread und speichere ihn mit einer fortlaufenden ID ab. so kann ich auch später bequem drauf zugreifen und ihn beenden.

Klaus01 2. Feb 2012 14:15

AW: Verwaltung von unbestimmter Anzahl Threads
 
.. im create erzeugst Du eine Instanz von TObjectList.
Wenn Du im create einen Thread erzeugst, hast Du keine unbestimmte anzahl.

Ich würde den Thread (separat) erzeugen und mit add an die Liste anhängen.

Delphi-Quellcode:
objectList := TObjectList.create(true);
objectList.add(TDeinThreadType.create(false));
Grüße
Klaus

himitsu 2. Feb 2012 14:25

AW: Verwaltung von unbestimmter Anzahl Threads
 
Werden die Threads immer nur in einem Thred erstellt und freigegeben?


Wenn nicht:
Es gibt leider keine threadsicher TObjektList, aber wenigstens eine Delphi-Referenz durchsuchenTThreadList.
Das ist eine Liste, auf welche man threadsicher, von unterschiedlichen Threads, zugreifen kann.

Oder man nimmt eine TObjektList (mit Generics eine TObjektList<TThread> ) und z.B. eine CriticalSection zum Schutz der Liste.

MiKaEr 2. Feb 2012 14:46

AW: Verwaltung von unbestimmter Anzahl Threads
 
mh also ich habe nun folgendes. das ist nicht perfekt, aber besser kann ich es nicht:

Delphi-Quellcode:
// ...
uses Unit4;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); // thread starten und in liste einfügen
begin
 ThreadList.Add(TTestThread.Create(Label1));
end;

procedure TForm1.Button3Click(Sender: TObject); // thread beenden (?!) und aus liste nehmen
begin
 ThreadList.Delete(0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ThreadList := TObjectList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 ThreadList.Free;
end;
meine thread-klasse:
Delphi-Quellcode:
unit Unit4;

interface

uses
 System.Classes, StdCtrls, SysUtils;

type
 TTestThread = class(TThread)
 private
 FMeinString: String;
  Flbl: TLabel;
  { Private-Deklarationen }
 protected
  procedure Execute; override;
 public
  constructor Create(lb: TLabel); virtual;
 end;

implementation

uses Unit1;
{ TTestThread }

constructor TTestThread.Create(lb: TLabel);
begin
 inherited Create(False);

 FMeinString := 'X';
 Flbl := lb;
end;

procedure TTestThread.Execute;
var
 i: Integer;
begin
 Randomize;

 while not Terminated do
  begin
   for i := 0 to 9 do
    if Terminated then
     break
    else
     sleep(1000);

   Flbl.Caption := IntToStr(Random(1000));
   Synchronize(Form1.Update);
  end;
end;

end.
erklärung zum sleep:
ich lasse meinen thread pro schleifendurchlauf (while) eine bestimmte zeit schlafen. damit ich ihn aber nicht "einfriere" und auf einen klick auf einen button, welcher den thread beenden soll, reagieren kann, warte ich
10 mal 1 Sekunde statt 1 mal 10 Sekunden

MiKaEr 2. Feb 2012 16:42

AW: Verwaltung von unbestimmter Anzahl Threads
 
leider habe ich ein kleines problem die threads zu beenden. ich muss während der laufzeit an eine string-variable, welche ich beim anlegen des threads befülle, herankommen.

wie genau mache ich das?

die threadklasse sieh so aus wie im post zuvor.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 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