Einzelnen Beitrag anzeigen

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, 18: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