AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Kurze Frage zur Thread Sicherheit

Ein Thema von luke2 · begonnen am 4. Okt 2012 · letzter Beitrag vom 5. Okt 2012
 
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Kurze Frage zur Thread Sicherheit

  Alt 5. Okt 2012, 01:51
Wenn du schon XE2 einsetzt, warum willst du unbedingt mit Arrays arbeiten?
IMHO wäre eine TQueue hier genau richtig. Die Verarbeitung dauert relativ lange (hast du gesagt), dann würde ich auf jeden Fall nicht erst alles abarbeiten und dann zu schauen, ob der Thread evtl. abgebrochen wird, sondern immer nur ein Paket bearbeiten.
Delphi-Quellcode:
TMyThread = class( TThread )
strict private
  FCS : TCriticalSection;
  FQueue : TQueue<TMyRecord>;
protected Execute; override;
public
  procedure Add( ARecord : TMyRecord );
end;

TMyThread.Add( ARecord : TMyRecord );
begin
  FCS.Enter;
  try
    FQueue.Enqueue( ARecord );
  finally
    FCS.Leave;
  end;

TMyThread.Execute;
var
  LRecord : TMyRecord;
  LHasData : Boolean;
begin
  while not Terminated do
    begin
      // Raus aus der Queue
      FCS.Enter;
      try
        LHasData := ( FQueue.Count > 0 );
        if LHasData then
          LRecord := FQueue.Dequeue;
      finally
        FCS.Leave;
      end;

      // Hier bietet sich auch wunderbar ein Event an, da der Thread dann solange schläft
      // bis wieder Daten vorhanden sind, oder der Thread terminiert wurde

      // Wenn keine Daten, dann schlafen und wieder von Vorne
      if not LHasData then
        begin
          Sleep( 1 );
          Continue;
        end;

      // Bearbeiten
      if LRecord.Use then
        ...

      // Rein in die Queue (wenn es denn sein soll)
      if LRecord.Use then
        begin
          FCS.Enter;
          try
            FQueue.Enqueue( LRecord );
          finally
            FCS.Leave;
          end;
        end;
    end;
end;
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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:26 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