AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Critical Section um globale Methode?

Ein Thema von Rabenrecht · begonnen am 5. Mai 2017 · letzter Beitrag vom 8. Jun 2017
Antwort Antwort
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Critical Section um globale Methode?

  Alt 5. Mai 2017, 09:52
Das stimmt. Die Vermutung besteht aber, dass verschiedene Threads unseres Programmes auf die Methode zugreifen. Das ist theoretisch möglich, da die Methode wie gesagt global verfügbar ist. Ob das aber wirklich so passiert, kann ich nicht sagen. Ein Kunde hat das Problem berichtet, reproduziert bekomme ich es nicht

Daher wäre ohnehin jede Lösung, die ich einbaue, ein Schuss ins Blaue.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.214 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Critical Section um globale Methode?

  Alt 5. Mai 2017, 10:10
Soweit wir noch nicht bei Science Fiction sind sollte dein Programm auch nur das tun was im Quelltext steht. Schau doch einfach an welchen Stellen im Code die Methode aufgerufen wird und nicht "theoretisch könnte das sein"


Critical Sections sind einfach: Du erzeugst dir einmalig so ein Objekt, und immer um einen Abschnitt zu sperren sagst du einmal Acquire() und wenn du fertig bist Release() http://docwiki.embarcadero.com/RADSt...che_Abschnitte

Delphi-Quellcode:
uses
   System.SyncObjs;
var
   criticalSection: TSynchroObj;

   
procedure funWithClipboard();
begin
   criticalSection.Acquire();
   try
      ClipBoard.Open();
      try
         // (...)
      finally
         ClipBoard.Close();
      end;
   finally
      criticalSection.Release();
   end;
end;


PS: Software die das Haus verlässt braucht unbedingt vernünftiges Exception-Logging sodass du direkt den kompletten Aufruf-Stack bekommst. Wenn die einzige Info nur ein kurzer Text auf einer Messagebox ist wird man echt nicht glücklich.
  Mit Zitat antworten Zitat
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Critical Section um globale Methode?

  Alt 5. Mai 2017, 11:21
Soweit wir noch nicht bei Science Fiction sind sollte dein Programm auch nur das tun was im Quelltext steht. Schau doch einfach an welchen Stellen im Code die Methode aufgerufen wird und nicht "theoretisch könnte das sein"
Die Codebasis ist über mehr als 20 Jahre entstanden, das Programm entsprechend groß und teilweise unübersichtlich. So einfach ist das leider nicht.

Zitat:
PS: Software die das Haus verlässt braucht unbedingt vernünftiges Exception-Logging sodass du direkt den kompletten Aufruf-Stack bekommst. Wenn die einzige Info nur ein kurzer Text auf einer Messagebox ist wird man echt nicht glücklich.
Haben wir. Bringt uns hier nur nichts, da ich das Problem bisher nicht reproduzieren kann. Ich muss mit dem Arbeiten, was der Kunde mitteilt.

Zitat:
Critical Sections sind einfach: Du erzeugst dir einmalig so ein Objekt, und immer um einen Abschnitt zu sperren sagst du einmal Acquire() und wenn du fertig bist Release() http://docwiki.embarcadero.com/RADSt...che_Abschnitte

Delphi-Quellcode:
uses
   System.SyncObjs;
var
   criticalSection: TSynchroObj;

   
procedure funWithClipboard();
begin
   criticalSection.Acquire();
   try
      ClipBoard.Open();
      try
         // (...)
      finally
         ClipBoard.Close();
      end;
   finally
      criticalSection.Release();
   end;
end;
Das werde ich mal versuchen, danke
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.065 Beiträge
 
Delphi 12 Athens
 
#4

AW: Critical Section um globale Methode?

  Alt 5. Mai 2017, 13:42
Viel einfacher:
Delphi-Quellcode:
TMonitor.Enter(ClipBoard);
try
  ...
finally
  TMonitor.Exit(ClipBoard);
end;
Schneller als eine Critical Section, genau auf das Objekt bezogen und ohne zusätzliche Initialisierung usw.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Critical Section um globale Methode?

  Alt 5. Mai 2017, 14:26
Schneller als eine Critical Section
Sofern sich da nichts geändert hat, dann leider nicht. Siehe z.b.:
https://www.delphitools.info/2013/06...iticalsection/

Meines Wissens nach versucht die Windows Implementation der Critical Section mitlerweile auch erstmal ein SpinLock, bevor es dann den teuren Context-Switch in den Kernel gibt. Sollte also nun sogar noch performanter sein.
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
10.065 Beiträge
 
Delphi 12 Athens
 
#6

AW: Critical Section um globale Methode?

  Alt 5. Mai 2017, 14:33
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
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Critical Section um globale Methode?

  Alt 11. Mai 2017, 13: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
TiGü

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

AW: Critical Section um globale Methode?

  Alt 5. Mai 2017, 14:35
Schneller als eine Critical Section
Sofern sich da nichts geändert hat, dann leider nicht. Siehe z.b.:
https://www.delphitools.info/2013/06...iticalsection/
Laut diesem Blogpost ist das seit XE5 gefixt:
http://blog.synopse.info/post/2016/0...d-applications
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.518 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Critical Section um globale Methode?

  Alt 11. Mai 2017, 09:29
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.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:56 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