![]() |
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:
Ich möchte gerne eine Liste in 3 Threads abarbeiten lassen.
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; Dazu setze ich die Threads auf 3
Delphi-Quellcode:
Nun da hapert es. Threads := 3; TThreadPool.Default.SetMaxWorkerThreads(Threads); 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:
Ich glaube aber nicht, dass das die Lösung ist.
if Threads < TThread.ProcessorCount then Threads := TThread.ProcessorCount;
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. |
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. |
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. |
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... |
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. |
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; |
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 |
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 04:42 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