AGB  ·  Datenschutz  ·  Impressum  







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

Critical Section um globale Methode?

Ein Thema von Rabenrecht · begonnen am 5. Mai 2017 · letzter Beitrag vom 8. Jun 2017
Antwort Antwort
Seite 2 von 4     12 34      
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#11

AW: Critical Section um globale Methode?

  Alt 11. Mai 2017, 13:33
Müssen Clipboard Operationen nicht auch im Mainthread ablaufen? Dann wäre noch ein Synchronize nötig und könnte vielleicht auch schon alleine helfen.
Synchronize aus dem Mainthread heraus aufzurufen wird ausdrücklich nicht empfohlen:

Warning: Do not call Synchronize from within the main thread. This can cause an infinite loop.

http://docwiki.embarcadero.com/Libra...ad.Synchronize
Michael Justin
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Critical Section um globale Methode?

  Alt 11. Mai 2017, 14:01
Müssen Clipboard Operationen nicht auch im Mainthread ablaufen? Dann wäre noch ein Synchronize nötig und könnte vielleicht auch schon alleine helfen.
Synchronize aus dem Mainthread heraus aufzurufen wird ausdrücklich nicht empfohlen:

Warning: Do not call Synchronize from within the main thread. This can cause an infinite loop.

http://docwiki.embarcadero.com/Libra...ad.Synchronize
Daher prüft man das vorher und ruft nur dann die Variante mit Synchronize auf.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#13

AW: Critical Section um globale Methode?

  Alt 11. Mai 2017, 14:48
In deinem Link steht doch genau die Antwort auf die Berichte über die schlechte Performance. Seit XE5 ist das behoben und schneller als eine CS.
Hier auch nochmal der Link:
https://community.embarcadero.com/bl...-monitor-38952
Oh, gut zu wissen. Hatte den Artikel noch von "damals" im Kopf und habe natürlich nur ganz unten nach Updates gesucht, bevor ich ihn gepostet habe Aber gut, dann scheint die Performance von TMonitor ja jetzt zumindest gleichwertig zur CriticalSection zu sein, wenn man einen adäquaten Wert für den SpinCount wählt.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Critical Section um globale Methode?

  Alt 11. Mai 2017, 22:24
Aber gut, dann scheint die Performance von TMonitor ja jetzt zumindest gleichwertig zur CriticalSection zu sein, wenn man einen adäquaten Wert für den SpinCount wählt.
Das passt in den meisten Fällen schon. Nur, wenn die Performance wirklich ein Problem ist, sollte man untersuchen, ob man damit etwas verbessern kann. Aber im Normalfall sollte man den SpinCount lassen wie er ist und TMonitor einfach verwenden.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#15

AW: Critical Section um globale Methode?

  Alt 7. Jun 2017, 11:44
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.

Geändert von SneakyBagels ( 7. Jun 2017 um 12:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

AW: Critical Section um globale Methode?

  Alt 7. Jun 2017, 14:41
Wie das aussieht muss ein Object geblockt werden. Welches denn genau?
Die Objektinstanz dient TMonitor 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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#17

AW: Critical Section um globale Methode?

  Alt 7. Jun 2017, 14:57
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:
- TTask Anfang (eine Aufgabe bei Klick im MainMenu)
 Monitor Enter
 try
  EineFunktionWirdAufgerufen
 finally
  Monitor Exit
 end;
- TTask Ende
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Critical Section um globale Methode?

  Alt 7. Jun 2017, 15:34
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:
TMyObject = class
  Lock: TCriticalSecition;
end;

MyObj.Lock.Enter
oder du nutzt das "versteckte" Feld in allen TObject, welches man über TMonitor ansprechen kann.
Delphi-Quellcode:
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;
Nur den Namen "Monitor" fand ich schon immer ein bissl "irreführend".
$2B or not $2B

Geändert von himitsu ( 7. Jun 2017 um 15:37 Uhr)
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#19

AW: Critical Section um globale Methode?

  Alt 7. Jun 2017, 15:45
Das Problem ist, dass ich für mein zuletzt genantes Beispiel keine Klasse habe und ich nur eine Funktion aufrufe.

Zitat:
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;
Das verstehe ich jetzt nicht. Wofür denn nun Monitor und eine CS?

Ich glaube ich bleibe einfach bei CS - ist einfacher und nicht so ein Hexenwerk
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#20

AW: Critical Section um globale Methode?

  Alt 7. Jun 2017, 16:12
Das verstehe ich jetzt nicht. Wofür denn nun Monitor und eine CS?
Grob gesagt ist es auch hier "egal", was du verwendest. Je nach Anwendungszweck können sich höchstens leichte Performanceunterschiede ergeben, aber was "besser" oder "schlechter" ist, kann man pauschal nicht sagen. Es sind einfach zwei verschiedene Paradigmen als Lösung für das selbe Problem.

Statt deiner CS könntest du dir einfach eine dummy TObject Instanz erstellen und darauf dann TMonitor.Enter anwenden. Macht aber nicht wirklich Sinn, weshalb ich hier wohl auch bei der globalen CriticalSection bleiben würde.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 22:24 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