AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie kann man das Ausführen der Threads Priorisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann man das Ausführen der Threads Priorisieren

Ein Thema von ManSues · begonnen am 25. Mär 2014 · letzter Beitrag vom 26. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
ManSues

Registriert seit: 22. Sep 2012
Ort: Wittmund
9 Beiträge
 
Delphi 10.4 Sydney
 
#1

Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 19:05
Ich habe einen "Hauptthread" und mehrere "Nebenthreads". Alle greifen auf eine TThreadlist zu. Jetzt möchte ich den Zugriff auf TThreadlist priorisieren. Kann mir jemand sagen, wie man das macht?

Details:

HauptThread
TThreadlist.lock
was heraus holen
TThreadlist.unlock
Do something

NebenThread1
NebenThread2
NebenThread3
NebenThread4
:
NebenThread_n
alle rufen folgende Funktion auf
INPUT(data)
TThreadlist.lock
was hinein legen
TThreadlist.unlock

Der HauptThread soll die TThreadlist öffnen und schließen.
Dann soll nur EINER der Nebenthreads TThreadlist öffnen und schließen.
Dann soll wieder der HauptThread die TThreadlist öffnen und schließen.
Jetzt der nächste Nebenthread u.s.w. bis es wieder von vorne anfängt.
Manfred Süsens
  Mit Zitat antworten Zitat
grl

Registriert seit: 5. Feb 2007
174 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 19:10
Hmmmm - es sollen also die Nebenthreads warten "bis sie dran sind"? Widerspricht das nicht dem Konzept der Threads?

Ich löse sowas eigentlich immer über Thread.Priority - der wirklich wichtige bekommt eben mehr Priorität.

Wenn es wirklich wichtig ist, daß immer EINMAL der HauptThread und dann EINMAL einer der NebenThreads schreibt, dann würde ich mir überlegen, ob das Design richtig ist und ob's nicht gescheiter ist, das alles über den Hauptthread abzuwickeln ist, da du da zwangsläufig eine Wartesituation zusammenbringst.

Nur mal aufgrund der Informationen ins Blaue geraten,

GRL
  Mit Zitat antworten Zitat
ManSues

Registriert seit: 22. Sep 2012
Ort: Wittmund
9 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 19:16
Hallo,

nicht ganz, vielleicht sollte ich noch erwähnen, dass sich die Nebenthreads in DLLs befinden und es nicht vorhersehbar ist, wann sie schreiben wollen.
Noch genauer: die DLLs füllen die TThreadlist mit Telegrammen und der Hauptthread versendet sie per TCP.
Problem: Wenn ich die Nebenthreads nicht in ihre Schranken weise, schreiben die so viel, dass ich keine Zeit mehr habe um die Daten zu versenden!
Manfred Süsens

Geändert von ManSues (25. Mär 2014 um 19:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 19:28
dass sich die Nebenthreads in DLLs befinden und es nicht vorhersehbar ist, wann sie schreiben wollen.
Das ist das Wesen einer Multithreadanwendung.

Noch genauer: die DLLs füllen die TThreadlist mit Telegrammen und der Hauptthread versendet sie per TCP.
Problem: Wenn ich die Nebenthreads nicht in ihre Schranken weise, schreiben die so viel, dass ich keine Zeit mehr habe um die Daten zu versenden!
Dann solltest du das konsequent im Code umsetzen - z.B. das Schreiben nur erlauben, wenn die Liste nicht zu voll ist oder über eine Semaphore den maximalen Füllstand der Liste beschränken oder wie auch immer. Die Thread-Prioritäten zu ändern kann durchaus auch unerwünschte Nebenwirkungen haben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 19:29
Warum schreiben die alle in die gleiche Liste? Mach doch für jeden Thread eine eigene Liste, und dann arbeitest du die Listen im Hauptthread nach Priorität ab.

Geändert von Namenloser (25. Mär 2014 um 19:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 19:48
Also generell kann man so etwas mit einem Delphi-Referenz durchsuchenTEvent lösen
Delphi-Quellcode:
type
  TFoo = class
  private
    FThrottle : TEvent;
    FCS : TCriticalSection;
    procedure ReleaseThrottle;
  public
    constructor Create;
    destructor Destroy; override;

    procedure DoSomethingThrottled;
    procedure DoSomethingDifferent;
  end;

implementation

{ TFoo }

constructor TFoo.Create;
begin
  inherited Create;
  FThrottle := TEvent.Create( nil, False, False, '' );
end;

destructor TFoo.Destroy;
begin
  FThrottle.Free;
  FCS.Free;
  inherited;
end;

procedure TFoo.DoSomethingDifferent;
begin
  FCS.Enter;
  try
    // Aus der Liste holen
  finally
    FCS.Leave;
  end;
  ReleaseThrottle; // dem nächsten Thread den Zugang erlauben
end;

procedure TFoo.DoSomethingThrottled;
begin
  if FThrottle.WaitFor = TWaitResult.wrSignaled
  then
  begin
    FCS.Enter;
    try
      // In die Liste Legen
    finally
      FCS.Leave;
    end;
  end;
end;

procedure TFoo.ReleaseThrottle;
begin
  FThrottle.SetEvent;
end;
Der Hauptthread ruft jetzt immer DoSomethingDifferent auf und alle SubThreads rufen DoSomethingThrottled auf.
Der Event sorgt dafür, dass immer nur ein Thread durchschlüpfen kann und der nächste Thread, wenn im DoSomethingDifferent das ReleaseThrottle aufgerufen wird.

Über Sinn und Unsinn mag ich hier jetzt nicht diskutieren, aber es geht

PS Die CriticalSection ist natürlich bei einer ThreadList unnötig
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 20:05
Die Thread-Prioritäten zu ändern kann durchaus auch unerwünschte Nebenwirkungen haben.
Und wenn genügend CPU-Kerne frei sind, dann bringt es auch absolut nichts.
Denn selbst wenn ein Thread eine geringere Prio hat, wie ein anderer Thread, so kann es dennoch sein, daß der mit der geringeren Prio genauso schnell oder sogar schneller ist.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
ManSues

Registriert seit: 22. Sep 2012
Ort: Wittmund
9 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 21:40
Das mit den Events ist ein sehr interessanter und konstruktiver Vorschlag, danke.
Vielleicht habe ich mich mit dem Wort "Priorität" falsch ausgedrückt. Ich meinte nicht die Thread-Priorität. Man kann es auch einfach als Umschalter sehen zwischen füllen und leeren. Und schließlich muss mehr geleert werden als gefüllt, sonst funktioniert es nicht. Da ist es auch OK, wenn ein Füller wartet. Also ganz primitive betrachtet eine einfache Serialisierung.

Jeder DLL eine eigene Liste zu geben würde den Aufwand produzieren, dass wieder die DLL Listen gelockt und verwaltet werden müssten.

Man kann es auch mal ganz extrem sehen (was auch möglich wäre): Es gibt 100 Nebenthreads die fast gleichzeitig schreiben wollen. Da wäre der Hauptthread lange am warten, bis er wieder dran kommt (in Versuch nachgewiesen!)
Manfred Süsens

Geändert von ManSues (25. Mär 2014 um 21:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 22:00
Das mit dem Event kann man auch umdrehen.

Wenn der Sende-Thread lesen möchte, dann wird der Event zurückgesetzt und alle Empfangs-Threads werden durch den Event aufgehalten und können erst mal nicht mehr schreiben.
Ist der Sende-Thread fertig mit lesen, dann setzt der wieder den Event und alle schreiben wieder lustig in die Liste.

Dazu muss der Event wie folgt initialisiert werden:
Delphi-Quellcode:
TEvent.Create(
  nil,
  True, {ManualReset}
  True, {InitialState}
  '' );
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Wie kann man das Ausführen der Threads Priorisieren

  Alt 25. Mär 2014, 22:09
Jeder DLL eine eigene Liste zu geben würde den Aufwand produzieren, dass wieder die DLL Listen gelockt und verwaltet werden müssten.
Was ist daran mehr Aufwand? Aktuell lockst du doch auch bei jedem Zugriff eine Liste.

Man kann es auch mal ganz extrem sehen (was auch möglich wäre): Es gibt 100 Nebenthreads die fast gleichzeitig schreiben wollen. Da wäre der Hauptthread lange am warten, bis er wieder dran kommt (in Versuch nachgewiesen!)
In dem Fall wäre dann die Thread-Priorität eigentlich schon die richtige Stellschraube.

Edit: Falls es nicht klar war, jede Liste hätte natürlich auch ihr eigenes Lock. Sonst wäre die Sache witzlos.

Geändert von Namenloser (25. Mär 2014 um 22:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 21:31 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