Einzelnen Beitrag anzeigen

IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
80 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

ThreadPool Threads auf 3 begrenzen Pproblem

  Alt 28. Jan 2021, 15:52
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.

Geändert von IMPEGA (29. Jan 2021 um 12:18 Uhr)
  Mit Zitat antworten Zitat