AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi EnterCriticalsection erzeugt für einige Zeit hohe CPU Last
Thema durchsuchen
Ansicht
Themen-Optionen

EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

Ein Thema von JonnyGuitar · begonnen am 17. Aug 2010 · letzter Beitrag vom 20. Aug 2010
Antwort Antwort
JonnyGuitar

Registriert seit: 4. Jun 2004
233 Beiträge
 
#1

EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

  Alt 17. Aug 2010, 15:06
Hallo zusammen,

ich habe eine für Outlook eine Exchange-Client-Erweiterung geschrieden die Termine synchronisiert.
Das einlesen der Termine passiert in einem Thread mit einer Criticalsection.

Nehmen wir jetzt an es sind initial 20000 Termine vom Server eingelesen und weggeschrieben worden.
Am Ende verlasse ich die CriticalSection mit LeaveCriticalSection.
Beim erneuten EnterCrticalSection geht die CPU Last auf 100% und verbleibt dort so zwischen
5-10 Minuten. Danach geht das wieder auf 0 runter und auch der Debugger springt eine
Zeile weiter.

Hat eienr ne Idee woran das liegen könnte?


Gruss Jonny
the only thing to fear is runnin' out of beer
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
534 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

  Alt 17. Aug 2010, 16:44
Ohne Code?
Vermutlich benutzt Du die Selbe Critical Section an mehreren Orten und erzeugst einen Deadlock?
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#3

AW: EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

  Alt 19. Aug 2010, 19:24
Den CriticalSections habe ich nie getraut, weil ich solche Effekte auch mal hatte. Seitdem arbeite ich mit Mutexen, das ist bisher stressfrei, auch bei größeren Pausen und hohem Datendurchsatz. Mutexe sind systemweit bekannt, gehören aber Deinem Programm und Du legst Timeouts etc. selbst fest.

Grüße, Messie
  Mit Zitat antworten Zitat
JonnyGuitar

Registriert seit: 4. Jun 2004
233 Beiträge
 
#4

AW: EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

  Alt 20. Aug 2010, 09:51
@taveuni: Korrekt, ich benutze die CriticalSection an mehreren Stellen. Warum kann es dort zu Deadlocks kommen und wie kann ich das umgehen?

@messie: Ich kenne Mutexe um sicherzustellen das zum Beispiel ein Programm nur einmal gestartet werden kann. Wie kann ich denn damit eine CriticalSection ersetzen?


Gruss Jonny
the only thing to fear is runnin' out of beer
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#5

AW: EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

  Alt 20. Aug 2010, 12:42
Delphi-Quellcode:
var
  DataMutex : THandle; //Mutex für die Zugriffssteuerung auf den Datenpuffer
  initialization
  DataMutex := CreateMutex(nil,false,nil);
  
  //im Thread oder in der GUI dann z.B.:
      try
        if WaitForSingleObject(DataMutex,100) = WAIT_OBJECT_0 then
        begin
          //Datenübergabe
        end
        else
        begin
          WriteError('DataMutex','hier ist was schief gelaufen');
        end;
      finally
        ReleaseMutex(DataMutex);
      end;
Das benutzen dann alle Routinen, die auf den Speicher zugreifen wollen, hier sehr schnelle Vorgänge. Deshalb ist auch schon bei 100ms ein timeout. Bei Dir würde so ein Wert dann eher bei 10000 liegen. Aber Du kannst das explizit festlegen (auch mit INFINITE), und Du selbst fasst den geschützen Bereich an und lässt ihn wieder los. Zusätzlich kann man damit auch mehrere Ebenen verschachteln.

Grüße, Messie
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

  Alt 20. Aug 2010, 14:08
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#7

AW: EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

  Alt 20. Aug 2010, 14:13
Eine CriticalSection ist aber wesentlich performanter als ein Mutex. Sie macht intern auch (fast) nichts anderes als das Snippet von messie. Ergo: Der Fehler liegt in deinem Code, nicht in der CS.

-Win
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#8

AW: EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

  Alt 20. Aug 2010, 14:27
Eine CriticalSection ist aber wesentlich performanter als ein Mutex. Sie macht intern auch (fast) nichts anderes als das Snippet von messie. Ergo: Der Fehler liegt in deinem Code, nicht in der CS.

-Win
Wieso ist die CriticalSection performanter, wenn sie intern annährend dasselbe tut?

Vorteil für mich ist der timeout, mit dem ich meine Vorgänge steuern kann.

Grüße, Messie
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#9

AW: EnterCriticalsection erzeugt für einige Zeit hohe CPU Last

  Alt 20. Aug 2010, 14:37
Eine CriticalSection ist größtenteils im Usermode implementiert, daher sind weniger Context Switches nötig. Es gibt auch die Funktion TryEnterCriticalSection mit der sich "Timeouts" realisieren lassen.

Ich bin aber der Meinung, dass eine CriticalSection den lock bekommen sollte, wenn sie ihn braucht. Wenn der Lock nicht zwingend Nötig ist, ist ein Event/Mutex/Semaphore besser geeignet.
  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 08:17 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