AGB  ·  Datenschutz  ·  Impressum  







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

Threads - Einstellbar

Ein Thema von -187- · begonnen am 24. Mär 2010 · letzter Beitrag vom 25. Mär 2010
Antwort Antwort
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#1

Threads - Einstellbar

  Alt 24. Mär 2010, 23:28
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Aussagekräftiger Titel

  Alt 24. Mär 2010, 23:29
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: Threads - Einstellbar

  Alt 24. Mär 2010, 23:34
Threadsicherer Stack?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#4

Re: Threads - Einstellbar

  Alt 24. Mär 2010, 23:37
Kompetente Aussage, hilft mir nicht weiter... Vielleicht kannst du das ein bisschen ausführen ?!
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

Re: Threads - Einstellbar

  Alt 24. Mär 2010, 23:50
Hier wird erklärt, was ein Stack überhaupt ist. Man kann Elemente darauf werfen und wieder davon herunter holen. Die Frage ist, ob du sowas brauchst, oder nicht eher eine Queue. Es ändert sich die Reihenfolge, in der die Elemente einzeln geholt werden. Wenn du diese beiden Konstrukte nicht kennst, dann würde ich dir echt empfehlen es zu lesen.

Hier mal eine erweiterte StringList. Wenn Fehler auftauchen, musst selbst danach schauen. Ist hier einfach schnell runter programmiert.
Delphi-Quellcode:
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 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.

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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Threads - Einstellbar

  Alt 25. Mär 2010, 01:00
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.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Threads - Einstellbar

  Alt 25. Mär 2010, 07:57
Zitat von -187-:
Hat jemand ne Idee wie ich das angeh ?
Ja, hier. Aber erst lesen, dann probieren und dann erst Fragen stellen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


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