AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

CriticalSection nötig ?

Ein Thema von DataCool · begonnen am 10. Dez 2003 · letzter Beitrag vom 10. Dez 2003
 
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#6

Re: CriticalSection nötig ?

  Alt 10. Dez 2003, 10:07
Der Unterschied leigt, wie häufig in der OOP, bei der Zuständigkeit: Den Thread hat es nicht zu interessieren, dass er "schlafen gelegt wird". Auch das Locking sollte nicht in seinen Zuständigkeitsbereich fallen.
Idealerweise ist diese Verhalten vollkommen transparent, etwa in der Form:
Delphi-Quellcode:
procedure TMyThread.Execute;
var
  myItem: TMyClass;
begin
  Assert(Assigned(FFifoData), 'FiFo-Buffer not assigned');

  while not Terminated do
  begin
    myItem:= FFifoData.Pop;
    DoSthWidth(myItem);
  end;
end;
bzw
Delphi-Quellcode:
procedure TMyTread.AddItem(const AnItem: TMyClass);
begin
  if not Assigned(AnItem) then
    raise EItemNotAssignedError.Create(ItemNotAssigned);

  Assert(Assigned(FFifoData), 'FiFo-Buffer not assigned');
  FFifoData.Push(AnItem);
end;
Das Blockieren eines Clients (Aufrufer), der die Nachricht Pop schickt, sowie dessen anschließende Fortsetzung, sobald ein Element dem Puffer hinzugefügt worden ist, übernimmt nach diesem Muster vollständig der Puffer.

Problematisch ist in diesem Zusammenhang lediglich der Fall, dass der Thread beendet werden soll, jedoch kein weiterer Eintrag im Puffer vorhanden ist. Hierfür könnte eine spezielle Methode des Puffers eingesetzt werden, der alle Consumer (den Thread) weckt, ohne ein Element als Rückgabewert von Pop zur Verfügung zu stellen. Denkbar ist der Wurf einer Exeception EBufferClosed, die dann in Execute adequat behandelt werden sollte:
Delphi-Quellcode:
procedure TMyThread.Execute;
var
  myItem: TMyClass;
begin
  while not Terminated do
  try
    myItem:= FFifoData.Pop;
    DoSthWidth(myItem);
  except
    on EBufferClosed do
      Terminate;
  end;
end;
gruß, choose
  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 16:54 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