AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Critical Sections

Ein Thema von iphi · begonnen am 1. Nov 2009 · letzter Beitrag vom 2. Nov 2009
Antwort Antwort
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

Frage zu Critical Sections

  Alt 1. Nov 2009, 19:59
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Frage zu Critical Sections

  Alt 1. Nov 2009, 20:18
Zitat von iphi:
Gehe ich richtig in der Annahme, dass ich trotzdem bei Schreibzugriffen in den Propertymethoden Critical Sections benutzen muss?
ja

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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
 
#3

Re: Frage zu Critical Sections

  Alt 1. Nov 2009, 23:06
moin,

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

cu

Oliver
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 jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.356 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Frage zu Critical Sections

  Alt 2. Nov 2009, 00:01
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#5

Re: Frage zu Critical Sections

  Alt 2. Nov 2009, 06:38
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Frage zu Critical Sections

  Alt 2. Nov 2009, 06:46
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#7

Re: Frage zu Critical Sections

  Alt 2. Nov 2009, 07:32
Zitat von himitsu:
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Frage zu Critical Sections

  Alt 2. Nov 2009, 08:49
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 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Frage zu Critical Sections

  Alt 2. Nov 2009, 08:51
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;
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#10

Re: Frage zu Critical Sections

  Alt 2. Nov 2009, 09:18
Danke, ich denke jetzt hab ich alle Varianten begriffen. Das war sehr hilfreich.
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:15 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