AGB  ·  Datenschutz  ·  Impressum  







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

ThreadPool Threads auf 3 begrenzen Pproblem

Ein Thema von IMPEGA · begonnen am 28. Jan 2021 · letzter Beitrag vom 30. Jan 2021
 
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
83 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
 


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 14:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz