Das ist die
TThreadList
aus
System.Classes
oder
System.Generics.Collections
, oder? Ich kann der nichts abgewinnen: Da fehlen elementarste Dinge wie ein
GetEnumerator()
und alles. Bist du sicher, dass du die brauchst? Ich hätte gedacht, dass du die RS232-Threads alle im Hauptthread erstellst und an die Liste dranhängst und ebenso dort auch die Liste wieder zumachen willst?
Ich nehme da einfach eine ganz "normale" Objektliste (
TObjectList
)- Soweit die
OwnsObjects = True
hat, ist die Freigabe der Liste mitsamt aller enthaltenen Threads so einfach wie ein
meineListe.Free();
Bsp:
Delphi-Quellcode:
program Project4;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.SyncObjs,
System.Classes,
System.Generics.Collections;
const
numThreads: Integer = 5;
var
threadList: TObjectList<TThread>;
threadNum: Integer;
threadIterator: TThread;
consoleCs: TSynchroObject;
//{$DEFINE OWNSOBJECTS}
procedure writeConsole(
const line:
String);
begin
consoleCs.Acquire();
try
WriteLn(line);
finally
consoleCs.Release();
end;
end;
function constructRunningThread(
const threadNum: Integer): TThread;
begin
Result := TThread.CreateAnonymousThread(
procedure
begin
writeConsole('
Thread ' + threadNum.ToString() + '
startet...');
sleep(1000 + Random(4000));
writeConsole('
Thread ' + threadNum.ToString() + '
endet...');
end
);
Result.FreeOnTerminate :=
{$IFDEF OWNSOBJECTS}False
{$ELSE}True
{$ENDIF};
Result.Start();
end;
begin
try
consoleCs := TCriticalSection.Create();
writeConsole('
Erstelle und fülle Liste...');
threadList := TObjectList<TThread>.Create(
{$IFDEF OWNSOBJECTS}True
{$ELSE}False
{$ENDIF}
);
for threadNum := 0
to Pred(numThreads)
do
threadList.Add(constructRunningThread(threadNum));
writeConsole('
Baue Liste ab...');
threadList.Destroy();
writeConsole('
Liste abgebaut');
writeConsole('
<Taste drücken>');
except
on E:
Exception do
WriteLn(E.ClassName, '
: ', E.
Message);
end;
ReadLn;
end.
// Roter Kasten:
Entweder ein TThread hat FreeOnTerminate = True und du fasst ihn nach dem Starten nicht mehr an(!) oder er hat es auf False und du gibst die TThread-Instanz selbst so frei wie du möchtest. Ich habe das mal versucht in das Beispiel zu packen: Du kannst das
{$DEFINE OWNSOBJECTS}
einmal auskommentieren und dir den Unterschied anschauen