AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

ThreadPool Threads auf 3 begrenzen Pproblem

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

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

Registriert seit: 10. Dez 2004
76 Beiträge
 
#2

AW: ThreadPool Threads auf 3 begrenzen Pproblem

  Alt 28. Jan 2021, 16:55
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.
  Mit Zitat antworten Zitat
IMPEGA

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

AW: ThreadPool Threads auf 3 begrenzen Pproblem

  Alt 28. Jan 2021, 17:11
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.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
1.923 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: ThreadPool Threads auf 3 begrenzen Pproblem

  Alt 28. Jan 2021, 20:14
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...
  Mit Zitat antworten Zitat
IMPEGA

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

AW: ThreadPool Threads auf 3 begrenzen Pproblem

  Alt 29. Jan 2021, 10:33
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.
  Mit Zitat antworten Zitat
IMPEGA

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

AW: ThreadPool Threads auf 3 begrenzen Pproblem

  Alt 29. Jan 2021, 12:23
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;
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
1.923 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: ThreadPool Threads auf 3 begrenzen Pproblem

  Alt 30. Jan 2021, 12:45
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
  Mit Zitat antworten Zitat
IMPEGA

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

AW: ThreadPool Threads auf 3 begrenzen Pproblem

  Alt 30. Jan 2021, 13:19
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.

Geändert von IMPEGA (30. Jan 2021 um 13:21 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:09 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