AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Multithread Einstellungsobjekt refreshen
Thema durchsuchen
Ansicht
Themen-Optionen

Multithread Einstellungsobjekt refreshen

Ein Thema von QuickAndDirty · begonnen am 19. Okt 2012 · letzter Beitrag vom 22. Okt 2012
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#1

Multithread Einstellungsobjekt refreshen

  Alt 19. Okt 2012, 12:39
Also Ich habe da ein Einstellungsobjekt MyConfig.
-Das Objekt kann sich in eine INI-File schreiben oder von dort auslesen.
-Das Eigenschaften des Objekts werdn von etlichen Hintergrund-Threads permanent gelesen.
-Es gibt nur einen Thread der auf das Objekt schreibend zu greift und das auch nur sehr selten, also vielleicht alle paar Monate mal. Im Idealfall nur einmal in der Lebensdauer der Anwendung.

Ich möchte nicht jeden Lese/schreib Zugriff mit einer Critical section versehen, weil schreibzugriffe soooo selten sind. Aber ich will trotzdem sicher sein das die funktionieren.
Gibt es 'ne Möglichkeit eine Unterbrechung für diesen kurzen seltenen Moment global Anwendnungsweit zu verhindern? Sprich alle Threads einzufrieren außer einem.
Ist die Lösung alle Threads zu terminieren? Das wäre echt schade.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (19. Okt 2012 um 12:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Multithread Einstellungsobjekt refreshen

  Alt 19. Okt 2012, 13:41
Delphi-Referenz durchsuchenTMultiReadExclusiveWriteSynchronizer bzw. TMREWSync


Und nein, Threads anzuhalten ist keine Lösung, darum ist das auch beim TThread "verboten" (es sei denn, man baut in jeden Thread einen Code ein, womit jeder Thread sich selbet "definiert" anhält)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (19. Okt 2012 um 14:27 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#3

AW: Multithread Einstellungsobjekt refreshen

  Alt 19. Okt 2012, 13:52
Danke!!!
Gucke mir das jetzt erst mal an, aber der Name hört sich vielversprechend an.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

AW: Multithread Einstellungsobjekt refreshen

  Alt 19. Okt 2012, 15:59
Wenn jeder Thread beim Erzeugen eine Kopie von MyConfig bekommt, dann wäre zumindest das Problem mit dem Mehrfachzugriff geregelt.
Noch besser wäre, wenn jeder Thread nur die Daten bekommt, die er auch braucht!

Wenn irgendjemand Geld vor dir möchte, dann gibst du ihm ja auch nicht deine Geldbörse mit
Bargeld, Kredit- und Visitenkarten, sondern du gibst ihm nur die Geldmenge die er haben will.
Aus dem gleichen Grund ist es unfein globale Objekte an Threads zu geben.

Fiktives Beispiel:
Delphi-Quellcode:
function CreateAndStartDatenleseThread: TDatenleseThread;
begin
  Result := TDatenleseThread.Create;
  Result.ComPort := MyConfig.ComPort;
  Result.Baudrate := MyConfig.Baudrate;
  ...
  Result.Resume;
end
Andreas
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#5

AW: Multithread Einstellungsobjekt refreshen

  Alt 19. Okt 2012, 16:48
Wenn jeder Thread beim Erzeugen eine Kopie von MyConfig bekommt, dann wäre zumindest das Problem mit dem Mehrfachzugriff geregelt.
Noch besser wäre, wenn jeder Thread nur die Daten bekommt, die er auch braucht!

Wenn irgendjemand Geld vor dir möchte, dann gibst du ihm ja auch nicht deine Geldbörse mit
Bargeld, Kredit- und Visitenkarten, sondern du gibst ihm nur die Geldmenge die er haben will.
Aus dem gleichen Grund ist es unfein globale Objekte an Threads zu geben.

Fiktives Beispiel:
Delphi-Quellcode:
function CreateAndStartDatenleseThread: TDatenleseThread;
begin
  Result := TDatenleseThread.Create;
  Result.ComPort := MyConfig.ComPort;
  Result.Baudrate := MyConfig.Baudrate;
  ...
  Result.Resume;
end
Die Daten des Objektes werden nur gelesen. Wenn sie geändert werden dann müssen die Threads nach den neuen Daten arbeiten. Und geändert werden sie nur von genau einem Thread der eben ein Webinterface mit diesen Einstellungen bereitstellt. Ich kann also nicht viel mit threadlokalen Kopien dieser Daten anfangen.

Was passiert wenn ich BeginWrites im selben threat kaskadiere?
Delphi-Quellcode:
BeginWrite;
BeginWrite;
EndWrite;
EndWrite;
Oder BeginReads im WriteLock block des selben threads nutze?
Delphi-Quellcode:
BeginWrite;
BeginRead;
EndRead;
EndWrite;
geht das?

Eine Sache wäre da noch. Gibt es 'ne Möglichkeit threadsichere Getter und Setter für Published Properties automatisch zu erzeugen?
Oder gibt es ein "Synchronized", "Threadsafe" oder "Atomic" Flag oder so für Properties?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Multithread Einstellungsobjekt refreshen

  Alt 19. Okt 2012, 17:17
In einem Thread ist es erstmal grundsätzlich egal, ob man BeginRead und BeginWrite verschachtelt.

Aber es könnte zu einem DeadLock führen, wenn mehrere Thread sowas machen.
Jedenfalls muß/sollte man bei einer Verschachtelung immer das "Höherwertige" zuerst sperren.
höherwertig/restriktiv = Write
niederwertig/extensiv = Read


keine Probleme
Delphi-Quellcode:
Thread 1:
BeginRead
...
EndRead

Thread 2:
BeginRead
...
BeginWrite
...
EndWrite
...
EndRead
Wenn aber zwei/mehrere Threads das machen, was Thread 2 macht,
dann würden alle Threads bei BeginWrite für immer auf die jeweils Anderen warten, welche gleichzeitig via BeginRead gesperrt haben, wärend sie auf BeginWrite warten, da BeginWrite darauf wartet, daß sich kein anderer Thread im Lese- und Schreibzugriff befindet.

Das Selbe geschieht auch, wenn man z.B. zwei/mehrere CriticalSections verschachtelt ... auch da muß man überall die CS in der selben Reihenfolge sperren und muß immer alle "höheren" mit sperren.
z.B. CS1, CS2 und CS3 müssen immer in dieser Reihenfolge gesperrt wernden und selbst wenn man nur CS2 braucht, dann muß dennoch vorher CS1 gesperrt werden, damit kein DeadLock entstehen kann.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (19. Okt 2012 um 17:20 Uhr)
  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
 
#7

AW: Multithread Einstellungsobjekt refreshen

  Alt 20. Okt 2012, 03:36
Eine CriticalSection regelt nicht nur den Zugriff sondern hilft auch dabei konsistente Daten auszutauschen.
Dieses funktioniert bei MultiReadExclusiveWrite nicht, denn wenn der Comport schon geändert wurde, aber noch nicht die Baudrate, etc. dann habe ich inkonsistente Daten.

Mein Vorschlag:

Der Schreiber-Thread sperrt zum Schreiben das Config-Objekt über eine CS, trägt alle Daten ein und gibt die Sperre wieder frei.
Die Leser-Threads holen sich von dem Config-Objekt eine Kopie ab und lesen von dort die Einstellungen.
Der Leser-Thread entscheidet nun, zu welchem Zeitpunkt er die Daten haben will. Dazu bietet das Config-Objekt zwei Methoden an:

1. Config-Daten nur dann kopieren, wenn es nicht gesperrt ist (CS.TryEnter)
2. Config-Daten kopieren erzwingen, auch wenn man warten müsste (CS.Enter)

Der Thread kann sich nun entscheiden, ob er sich bremsen lassen will, oder es hinnehmen kann mit den "alten" Daten zu arbeiten (die vor ein paar Millisekunden noch "aktuell" waren)
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 himitsu
himitsu
Online

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

AW: Multithread Einstellungsobjekt refreshen

  Alt 20. Okt 2012, 09:00
... sondern hilft auch dabei konsistente Daten auszutauschen.
Das simmt so nicht ganz.

Wenn etwas "gemeinsam" (zusammenhängend) gesetzt oder ausgelesen werden muß, dann muß man dieses auch gemainsam schützen/blockieren
und das trifft sowohl auf die CS, als auch auf den MREW zu.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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
 
#9

AW: Multithread Einstellungsobjekt refreshen

  Alt 20. Okt 2012, 09:26
... sondern hilft auch dabei konsistente Daten auszutauschen.
Das simmt so nicht ganz.

Wenn etwas "gemeinsam" (zusammenhängend) gesetzt oder ausgelesen werden muß, dann muß man dieses auch gemainsam schützen/blockieren
und das trifft sowohl auf die CS, als auch auf den MREW zu.
Du hast Recht, das geht mit dem MREW genauso und der bietet sich in diesem Fall dafür sogar an.
Allerdings halte ich es für unerlässlich, dass jeder Thread eine Kopie der Daten hat, denn nur der Thread selber kann entscheiden, wann er bereit für eine neue Config ist und kann diese dann abholen. Wird dort gerade die Config überarbeitet, dann wartet er (und alle anderen) solange, bis dort gelesen werden kann.
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
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#10

AW: Multithread Einstellungsobjekt refreshen

  Alt 22. Okt 2012, 11:09
... sondern hilft auch dabei konsistente Daten auszutauschen.
Das simmt so nicht ganz.

Wenn etwas "gemeinsam" (zusammenhängend) gesetzt oder ausgelesen werden muß, dann muß man dieses auch gemainsam schützen/blockieren
und das trifft sowohl auf die CS, als auch auf den MREW zu.
Du hast Recht, das geht mit dem MREW genauso und der bietet sich in diesem Fall dafür sogar an.
Allerdings halte ich es für unerlässlich, dass jeder Thread eine Kopie der Daten hat, denn nur der Thread selber kann entscheiden, wann er bereit für eine neue Config ist und kann diese dann abholen. Wird dort gerade die Config überarbeitet, dann wartet er (und alle anderen) solange, bis dort gelesen werden kann.
Ich überlege ob es möglich ist, dass das Objekt sich selbst dem jeweiligen thread in einer beständigen Kopie zur Verfügung stellt.
Die Kopie würde dann über ein Dirtyflag anzeigen können das sie veraltet ist und
eine Refresh Funktion könnte dann vom Thread aufgerufen die Kopie aktualisieren.

So hätte ich konsistente und Lesevorgänge und sichere Schreibvorgänge.
Andreas
Monads? Wtf are Monads?
  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 10:07 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