Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   ThreadPool Threads auf 3 begrenzen Pproblem (https://www.delphipraxis.net/206778-threadpool-threads-auf-3-begrenzen-pproblem.html)

IMPEGA 28. Jan 2021 15:52

ThreadPool Threads auf 3 begrenzen Pproblem
 
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
Delphi-Quellcode:
  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.

user69 28. Jan 2021 16:55

AW: ThreadPool Threads auf 3 begrenzen Pproblem
 
Solch ein Problem hatte ich auch schon. Da meine Threads rechenintensiv sind wollte ich die auf die Anzahl der CPU-1 setzen. Erst mal ohne Erfolg, da Emba in System.Threading.pas eine Threadanzahl >= ProcessorCount verlangt.
Geholfen hat das editieren der System.Threading.pas.

IMPEGA 28. Jan 2021 17:11

AW: ThreadPool Threads auf 3 begrenzen Pproblem
 
Danke erstmal.
Hm...OK, also liegt es nicht wirklich an mir.
Nun ja, das Editieren der System.Threading.pas traue ich mir eher nicht zu.

TurboMagic 28. Jan 2021 20:14

AW: ThreadPool Threads auf 3 begrenzen Pproblem
 
Wenn dieses Verhalten so störend ist, erstellt doch bitte
einen Report unter quality.embsrcadero.com erstellen.
Bitte danach die Reportnummer hier posten.

Ich glaube auch für 10.4.2 sind ein paar Multithreading
Verbesserungen geplant. Falls eine Subskription vorhanden
ist könnte man ja auch am Beta Test teilnehmen...

IMPEGA 29. Jan 2021 10:33

AW: ThreadPool Threads auf 3 begrenzen Pproblem
 
Verhalten störend?
Ja natürlich. Schon alleine wegen dem, KÖNNEN.
Nicht brauchen ist eine Sache, es machen zu können ist eine andere.

Nun ja, ich bin nur ein Hobby Programmierer.
Das Problem genau zu beschreiben ist schon schwer genug.
Ein Hinweis auf Beta Version bei Hobbyprogrammierer bzw. ein Kauf einer neuen Version ist für einen Hobbyprogrammierer eher zu kostspielig.
Es reicht schon, dass ich mir die 10.1 gegönnt habe. Das war schon teuer genug.
Updaten kann man halt auf die 10.2 und danach schön weiter blechen.
Emba lässt sich auch fast jede neue Version teuer bezahlen.
Das alleine ist schon schlimm genug.

Danke für deine Vorschläge, es ist nicht mal sarkastisch gemeint, ich verzichte aber lieber und zerstöre meine System.Threading.pas paar Mal bis ich es irgendwie hinkriege.
Was anderes kann ich mir einfach nicht leisten.

IMPEGA 29. Jan 2021 12:23

AW: ThreadPool Threads auf 3 begrenzen Pproblem
 
Sorry für Doppelpost, ist aber eine weitere Frage

Ist das eigentlich korrekt wie ich den/die Parameter an Task übergebe?
Delphi-Quellcode:
procedure TForm1.ButtonThreadPoolClick(Sender: TObject);
var
  Liste : TStringList;
  Index : Integer;
  Threads : Word;
  Parameter : string;  //HIER
begin
  Parameter := '&id=8356286'; // HIER

  Threads := 3;
  if Threads < TThread.ProcessorCount then Threads := TThread.ProcessorCount;

  TThreadPool.Default.SetMaxWorkerThreads(Threads);
  Label2.Caption := IntToStr(TThreadPool.Default.MaxWorkerThreads);

  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)
            var
              URL : string;
            begin
              if Loader.Status = TTaskStatus.Canceled then ALoopStatus.Break;

//              URL := Liste[I];

              URL := Liste[I] + Parameter; // UND HIER IM THREAD
              // ...
              Sleep(Random(1000));
              //...

              TTHread.Queue(nil,
                procedure
                  begin
                     with ListView1.Items.Add do
                       begin
                         Caption := URL;
                       end;
                  end);
            end);
        Label1.Caption := 'Fertig';
        FreeAndNil(Liste);
      end);
end;

TurboMagic 30. Jan 2021 12:45

AW: ThreadPool Threads auf 3 begrenzen Pproblem
 
Hallo,

hast du Hobby Entwickler schon mal von der Community Edition gehört?
Wenn du mit deiner Entwicklertätigkeit keinen oder nur recht geringen Umsatz erzielst
ist die kostenlos. Lizenz läuft jeweils ein Jahr und Updates gibt's in dem Zeitraum
normalerweise keine.

Aktuell gibt's das noch als 10.3.3, ich vermute aber das irgendwann auch
eine 10.4.x rauskommt.

Grüße
TurboMagic

IMPEGA 30. Jan 2021 13:19

AW: ThreadPool Threads auf 3 begrenzen Pproblem
 
Hi
Nein, habe ich in der Tat nicht.
Schaue mir aber Sie an.
Nun habe ich aber eine gekaufte 10.2 in vollen Umfang.
Ob sich da der Umstieg lohnt?
Das muss ich erst prüfen.

Das hat allerdings nichts mit meiner Frage zu tun gehabt.
Ich hoffe immer noch auf eine Antwort auf die letzte Frage.

Die Frage wäre nämlich, ob man weitere Parameter als Variable so übergeben kann oder irgendwie per Synchronize.
Beides habe ich ausprobiert, beides funktioniert.
Ich möchte aber wissen was korrekt ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf