![]() |
Threads - Einstellbar
Nochmal eine Frage zu den Threads. Mein Programm bearbeitet 100 Lines einer TStringList ab. Für jede Line mach ich einen neuen Thread auf. Jedoch würde ich gerne 10 Threads haben die 100 Lines abarbeiten. Wie bring ich die Threads dazu sich immer wieder einen neuen String aus der StringListe zu nehmen bis alle Strings abgearbeitet sind ?
Hat jemand ne Idee wie ich das angeh ? |
Aussagekräftiger Titel
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt. Um den Titel zu ändern, editiere einfach deinen ersten Beitrag. Damit erleichterst du das Auffinden deines Beitrages mit der Suche und ersparst anderen Mitglieder ein unnötiges Öffnen deines Beitrages.
|
Re: Threads - Einstellbar
Threadsicherer Stack?
|
Re: Threads - Einstellbar
Kompetente Aussage, hilft mir nicht weiter... Vielleicht kannst du das ein bisschen ausführen ?!
|
Re: Threads - Einstellbar
![]() ![]() Hier mal eine erweiterte StringList. Wenn Fehler auftauchen, musst selbst danach schauen. Ist hier einfach schnell runter programmiert.
Delphi-Quellcode:
Du kannst nun alle Threads auf die beiden Methoden Push und Pop zugreifen lassen und es kommt eigentlich nie zu Problemen. Das regelt die CriticalSection. Es darf sich hierbei nur ein Thread innerhalb von den Zeilen zwischen Enter und Leave befinden, dazu findest viel im Forum.
TThreadSaveStackStringList = class(TStringList)
private FCriticalSection : TCriticalSection; // es brauch hierfür ein Eintrag in der uses-Klausel public procedure Push(const AStr: String); function Pop(): String; constructor Create(); // irgnedwas kommt hier noch in Klammern ;) destructor Destroy(); end; procedure TThreadSaveStackStringList.Push(const AStr: String); begin FCriticalSection.Enter(); try // für Stack Self.Insert(0, AStr); // oder gehört die Parameter tauschen // für Queue //Self.Add(AStr); finally FCriticalSection.Leave(); end; end; function TThreadSaveStackStringList.Pop(): String begin FCriticalSection.Enter(); try Result := ''; // Leerstring wird ausgegeben, wenn keine Elemente vorhanden sind if (Self.Count > 0) then begin Result := Self[0]; Delete(0); end; finally FCriticalSection.Leave(); end; end; constructor TThreadSaveStackStringList.Create(); begin inherited Create(); FCriticalSection := TCriticalSection.Create(); end; destructor TThreadSaveStackStringList.Destroy(); begin FreeAndNil(FCriticalSection); inherited Destroy(); end; Du darfst hierbei auch nur Push und Pop nutzen, um auf die Strings zuzugreifen. Besser wäre es sogar, wenn man die StringList kapselt, bin aber zu faul das jetzt noch umzuprogrammieren :) Vielleicht gibts auch schon einen TStack, schau einfach mal. |
Re: Threads - Einstellbar
Wenn von vorne herein die zu bearbeitenden Daten fest stehen, und es nicht um eine kontinuierliche Abarbeitung ständig neu eintreffender Daten geht, kann es auch Sinn machen jedem Thread vor Beginn seine Daten ganz privat an die Hand zu geben. Dadurch muss nachher keiner auf einen anderen Warten, was bei einem gemeinsamen Stack auftreten würde.
Ob das besser ist, ist wie so oft Abwägungssache. Wenn es "einfach" ist die vorhandenen Daten in N Blöcke zu zerteilen, sollte das durchaus einen spürbaren Vorteil ergeben. (Eine Liste wäre da z.B. so ein Kandidat, da jedem Thread lediglich ein Mal ein Pointer an die Hand gegeben werden müsste. Bei einem Array schauts wieder düsterer aus, da dort in aller Regel in lokale Arrays umkopiert werden muss - kann auch etwas flotter sein als stückweises Abholen "on the fly", aber bei weitem nicht mehr so signifikant.) |
Re: Threads - Einstellbar
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 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 by Thomas Breitkreuz