Hallo, schon wieder eine Anfängerfrage.
Ich habe mich mittlerweile etwas mehr mit Threads beschäftigt und muss sagen, es ist nicht so schwer wie erwartet.
Doch es gibt immer wieder Problemchen mit den ich nicht klarkomme.
Das ist mein Testcode
Delphi-Quellcode:
private
{ Private-Deklarationen }
Loader : ITask;
procedure TForm1.ButtonThreadPoolClick(Sender: TObject);
var
Liste : TStringList;
Index : Integer;
Threads : Word;
begin
Threads := 3;
if Threads < TThread.ProcessorCount
then Threads := TThread.ProcessorCount;
//....DAS MÖCHTE ICH NICHT HABEN ....
TThreadPool.
Default.SetMaxWorkerThreads(Threads);
Label2.Caption := IntToStr(TThreadPool.
Default.MaxWorkerThreads);
{Nur zur Prüfung}
Liste := TStringList.Create;
for Index := 1
to 300
do
Liste.Add(
Index.ToString);
Loader := TTask.Run(
procedure
begin
TParallel.
For(0, Liste.count - 1,
procedure(I : Integer; ALoopStatus : TParallel.TLoopState)
{I wird an die Methode übergeben, damit habe ich den Wert aus der Liste im Thread}
var
URL :
string;
begin
if Loader.Status = TTaskStatus.Canceled
then ALoopStatus.Break;
{Um Abbruch zu realisieren}
URL := Liste[I];
// ...
Sleep(Random(1000));
{Muster für mach etwas}
//...
TTHread.Queue(
nil,
procedure
begin
with ListView1.Items.Add
do
begin
Caption :=
URL;
end;
end);
end);
Label1.Caption := '
Fertig';
FreeAndNil(Liste);
end);
end;
procedure TForm1.ButtonAbbruchClick(Sender: TObject);
begin
Loader.Cancel;
end;
Ich möchte gerne eine Liste in 3 Threads abarbeiten lassen.
Dazu setze ich die Threads auf 3
Delphi-Quellcode:
Threads := 3;
TThreadPool.Default.SetMaxWorkerThreads(Threads);
Nun da hapert es.
Sobald meine Zahl < Kerne ist, wird automatisch Default auf 100 (Rechner mit 4 Kernen) bzw. 200 (Rechner mit 8 Kernen) gesetzt.
Ich überbrücke es damit
if Threads < TThread.ProcessorCount then Threads := TThread.ProcessorCount;
Ich glaube aber nicht, dass das die Lösung ist.
Es sollte doch möglich sein ein ThreadPool in 3 Threads die Aufgaben erledigen zu lassen.
Einzelne Tasks will ich nicht benutzen, weil die Zahl variieren soll. 3,5,7,..... oder 45
Ich hoffe auf paar Tipps von den Profis.
Habt Verständnis mit mir, bin nur ein Hobby-Coder.