AW: Critical Section um globale Methode?
Zitat:
Warning: Do not call Synchronize from within the main thread. This can cause an infinite loop. http://docwiki.embarcadero.com/Libra...ad.Synchronize |
AW: Critical Section um globale Methode?
Zitat:
|
AW: Critical Section um globale Methode?
Zitat:
Zitat:
Delphi-Quellcode:
ja jetzt zumindest gleichwertig zur CriticalSection zu sein, wenn man einen adäquaten Wert für den SpinCount wählt.
TMonitor
|
AW: Critical Section um globale Methode?
Zitat:
|
AW: Critical Section um globale Methode?
Durch " http://www.delphipraxis.net/1373672-post10.html " bin ich hier gelandet.
ich verwende bis heute eine globale CriticalSection in meinem Programm, welche von vielen Threads aufgerufen wird, die dieselben Daten lesen und schreiben. Überhaupt gar kein Problem und die Performance sieht auch OK aus. Wie würde die Implementierung eines System.TMonitor aussehen? Wie das aussieht muss ein Object geblockt werden. Welches denn genau? Meine TThread-Klasse kann man ja nicht übergeben. Was möchte TMonitor denn sonst haben? Muss ich hier Self (TThread-Unit) übergeben oder reicht auch einfach eine Variable? Diese Variable (Klasseninstanz) enthält alles was ich im Thread schreibend ändere. |
AW: Critical Section um globale Methode?
Zitat:
Delphi-Quellcode:
nur als Marker. Oft hat man ja eine seperate Datenklasse, auf die die Threads dann zugreifen. Hier würde ich die Instanz dieser Klasse verwenden, aber im Grunde ist es komplett egal, welches Objekt du verwendest.
TMonitor
|
AW: Critical Section um globale Methode?
Genau. Ich habe eine Klasse (vorher war es ein Record).
Dieser Klasseninstanz, welche nur einmalig erzeugt wird, weise ich in den Threads ein Objekt zu mit welchem ich dann weiterarbeite. Das Objekt enthält Strings, Integers... ganz normale Dinge. Aktuell habe ich eine globale CS welche von allen 5 Threads verwendet wird. Klappt sehr fein. Keinerlei Konflikte. Könnte ich dann nun einfach auf System.TMonitor.Enter(meine globale Klasseninstanz) verwenden und hätte dasselbe Ergebnis nur besser? Was müsste ich dem Enter denn übergeben, wenn ich sowas hier habe
Delphi-Quellcode:
Dort steht aktuell auch CriticalSections. Ohne ging das schief. Würde aber gerne weg von CS und hin zu Monitor nur weiß ich nicht, was ich dort als Objekt übergeben soll.
- TTask Anfang (eine Aufgabe bei Klick im MainMenu)
Monitor Enter try EineFunktionWirdAufgerufen finally Monitor Exit end; - TTask Ende |
AW: Critical Section um globale Methode?
Im Prinzip ist TMonitor die umgedrehte Implementation für mehrere TCriticalSection.
Du kannst in ein anderes Object eine CriticalSection rein tun und diese verwenden
Delphi-Quellcode:
oder du nutzt das "versteckte" Feld in allen TObject, welches man über TMonitor ansprechen kann.
TMyObject = class
Lock: TCriticalSecition; end; MyObj.Lock.Enter
Delphi-Quellcode:
Nur den Namen "Monitor" fand ich schon immer ein bissl "irreführend".
TMyObject = class
end; TMonitor.Enter(MyObj); // macht dann intern quasi sowas wie ein MyObj.geheimesproperty.Enter; // und vorher noch ein IF NOT Assigned(MyObj.geheimesproperty) THEN MyObj.geheimesproperty := TCriticalSectionÄhnlichesDing.Create; |
AW: Critical Section um globale Methode?
Das Problem ist, dass ich für mein zuletzt genantes Beispiel keine Klasse habe und ich nur eine Funktion aufrufe.
Zitat:
Ich glaube ich bleibe einfach bei CS - ist einfacher und nicht so ein Hexenwerk ;) |
AW: Critical Section um globale Methode?
Zitat:
Statt deiner CS könntest du dir einfach eine dummy
Delphi-Quellcode:
Instanz erstellen und darauf dann
TObject
Delphi-Quellcode:
anwenden. Macht aber nicht wirklich Sinn, weshalb ich hier wohl auch bei der globalen CriticalSection bleiben würde.
TMonitor.Enter
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 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