Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zu Critical Sections (https://www.delphipraxis.net/142684-frage-zu-critical-sections.html)

iphi 1. Nov 2009 19:59


Frage zu Critical Sections
 
Hallo,

ich möchte den Zugriff auf Variablen in meinem Thread von außen ausschließlich über published properties regeln.
Gehe ich richtig in der Annahme, dass ich trotzdem bei Schreibzugriffen in den Propertymethoden Critical Sections benutzen muss?

Wenn ja, wo initialisiere und lösche ich die Critical sections in meinem Threadobjekt? Im Construktor und im Destructor?

himitsu 1. Nov 2009 20:18

Re: Frage zu Critical Sections
 
Zitat:

Zitat von iphi
Gehe ich richtig in der Annahme, dass ich trotzdem bei Schreibzugriffen in den Propertymethoden Critical Sections benutzen muss?

ja

Zitat:

Zitat von iphi
Im Construktor und im Destructor?

idealer Weise ja

oder du leitest dein Objekt, wie dort http://www.delphipraxis.net/internal...t.php?t=167796 , von einem passenden Objekt ab, welches dieses schon beinhaltet.

Sir Rufo 1. Nov 2009 23:06

Re: Frage zu Critical Sections
 
moin,

hier findest du ein Thread-Gerüst, das u.a. Critical-Sections berücksichtigt

cu

Oliver

jaenicke 2. Nov 2009 00:01

Re: Frage zu Critical Sections
 
Zitat:

Zitat von iphi
ich möchte den Zugriff auf Variablen in meinem Thread von außen ausschließlich über published properties regeln.

Nur ganz am Rande: published bedeutet eigentlich, dass die entsprechenden Eigenschaften einer Komponente im Objektinspektor angezeigt werden sollen. ;-)
Damit verbunden ist, dass entsprechende Informationen mit gespeichert werden müssen. Das fällt bei public weg, die Sichtbarkeit nach außen ist aber gleich. Deshalb sollte published auch nur dort verwendet werden, wo man es braucht, und normalerweise eher public.

iphi 2. Nov 2009 06:38

Re: Frage zu Critical Sections
 
Hallo,

danke für den Hinweis public vs published. Danke auch für den Beispielcode.

Noch ne Frage:

Ist dieses Konstrukt auch akzeptabel?

Delphi-Quellcode:
//threadunit
...
initialization
  InitializeCriticalSection(CritSect);

finalization
  DeleteCriticalSection(CritSect);
end.
Zu welcher Gelegenheit werden die denn aufgerufen?

SirThornberry 2. Nov 2009 06:46

Re: Frage zu Critical Sections
 
Initialization und Finalization werden beim Programmstart und beim Programmende aufgerufen.
Ich würde es nicht dort platzieren. Denn du hättest dort nur eine globale Variable und verbaust dir somit die Möglichkeit mehrere Instanzen zu erstellen welche unabhängig von einander funktionieren.

Viktorii 2. Nov 2009 07:32

Re: Frage zu Critical Sections
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von iphi
Gehe ich richtig in der Annahme, dass ich trotzdem bei Schreibzugriffen in den Propertymethoden Critical Sections benutzen muss?

ja

[/quote]

Jetzt habe ich letztens hier gelernt, dass man bei Bool oder Byte Variablen das nicht braucht. Was stimmt denn nun?

himitsu 2. Nov 2009 08:49

Re: Frage zu Critical Sections
 
Weiß leider nicht ganz, in wie Weit sowas auf Multiprozessorsystemen stimmt, aber umsonst gibt es einige Dinge nicht.

Ich selber nutze für sowas seit Jahren den LOCK-Befehl in ASM.
PS: Auch die String-Referenzzählung wurde damit aufgebaut, um sie Threadsicher zu machen.

Für einfache Sachen kann man sicherheitshalber auch die Interlocked-Funktionen nutzen
= Delphi-Referenz durchsuchenInterlockedIncement und Co.


Zitat:

Zitat von SirThornberry
Denn du hättest dort nur eine globale Variable und verbaust dir somit die Möglichkeit mehrere Instanzen zu erstellen welche unabhängig von einander funktionieren.

Wenn alle diese Objekte sehr oft/immer auf eine gemeinsame Resource zugreifen, dann könnte es so auch richtig sein,
aber im Prinzip hast du Recht.

Blup 2. Nov 2009 08:51

Re: Frage zu Critical Sections
 
Eigentlich bräuchte man keine Critical Section, so lange es sich wirklich nur um eine Variable handelt, die mit einem einzigen Speicherzugriff geändert wird.
Aber!
In der Regel arbeitet der Thread in einem Arbeitschritt mit mehreren Variablen, deren Inhalt eventuell von einander abhängig ist. Deshalb wird der Zugriff am Anfang für alle Property gesperrt und erst nach der Verarbeitung wieder freigegeben.
Beispiel:
Delphi-Quellcode:
  while not Terminated do
  begin
    FSection.Acquire;
    try
      {hier die Verarbeitung der Property}
    finally
      FSection.Release;
    end;
    Sleep(50);
  end;
So eine Klasse kann sich auch mal ändern oder es wird davon abgeleitet.
Deshalb bei Property immer mit einer Critical Section arbeiten.

Oft ist es auch sinnvoll die Section selbst als Property verfügbar zu machen.
Dadurch können mehrere Property ausgewertet oder geändert werden, bevor der Thread weiterarbeitet:
Delphi-Quellcode:
  FSubThread.Section.Acquire;
  try
    if FSubThread.Property1 = ... then
    begin
      FSubThread.Property2 := ...
      FSubThread.Property3 := ...
    end;
  finally
    FSubThread.Section.Release;
  end;

iphi 2. Nov 2009 09:18

Re: Frage zu Critical Sections
 
Danke, ich denke jetzt hab ich alle Varianten begriffen. Das war sehr hilfreich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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