AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Probleme mit Enter/LeaveCriticalSection
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Enter/LeaveCriticalSection

Ein Thema von noisy_master · begonnen am 20. Sep 2016 · letzter Beitrag vom 22. Sep 2016
Antwort Antwort
Seite 1 von 2  1 2      
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
263 Beiträge
 
Delphi XE5 Professional
 
#1

Probleme mit Enter/LeaveCriticalSection

  Alt 20. Sep 2016, 22:43
Hallo zusammen,

ich verstehe das mit der Enter/LeaveCriticalSection irgendwie nicht: bei mir schein dienicht zu locken:
Ich habe mir ein kleines eigenes logging zusammengebastelt(ja ich weiss: sowas gibt es schon fertig....dazu bitte keine Ratschläge, weil ich verstehen möchte was ich falsch mache):

Der init code(wird einmalig aufgerufen)
Delphi-Quellcode:
procedure InitLog(path : string);
begin
  InitializeCriticalSection(FLock);
end;
und das deinitialisieren
Delphi-Quellcode:
procedure FinalizeLog;
begin
  DeleteCriticalSection(FLock);
end;
Das Logging, welches aus mehreren Threads(u.a. einige Timer) aufgerufen werden kann:
Delphi-Quellcode:
procedure WriteLnLog(output : string;level:Integer=1);
var f_size : Integer;
begin
  if True then
  begin
    EnterCriticalSection(FLock);
    OutputDebugString('in');
try
   if True then
   begin
    if (not fileexists(logpath)) then
      rewrite(logfile)
    else
      append(logfile);
    if output = 'then
     writeln(logfile,.........)
   else
     writeln(logfile,........);
    closefile(logfile);
   end;
finally
  OutputDebugString('out');
  LeaveCriticalSection(FLock);
end;
  end;
end;
Wie man sieht habe ich outputdebugstring drin, und damit sollte man abwechselnd in,out,in,out,in,out,...
erwarten. Leider bekomme ich manchmal:

Debug-Ausgabe: in Prozess xxx.exe (3332)
Debug-Ausgabe: in Prozess xxx.exe (3332)
Debug-Ausgabe: out Prozess xxx.exe (3332)
Erste Gelegenheit für Exception bei $7C812A7B. Exception-Klasse EInOutError mit Meldung 'E/A-Fehler 103'. Prozess xxx (3332)

Warum die exception kommt ist klar: da ist die datei einfach zu, aber was mich wundert ist warum ich überhaupt 2* in diese sektion komme.

Kann mir mal irgendjemand erklären was ich da falsch mache? (nebenbei:ist BDS2006)

Danke schon malfür eure Mühe!
Dirk
  Mit Zitat antworten Zitat
zagota

Registriert seit: 3. Sep 2014
38 Beiträge
 
#2

AW: Probleme mit Enter/LeaveCriticalSection

  Alt 21. Sep 2016, 08:01
CriticalSection funktionieren nur mit Threads nicht mit Timer. Häng mal die Timer ab, dann müsste es passen.

it True then was das?
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Probleme mit Enter/LeaveCriticalSection

  Alt 21. Sep 2016, 08:04
Timer? Doch, geht. Eine CriticalSection blockt zuverlässig alles ab, was da rein will - unabhängig davon, wo es herkommt.

In meinen Augen ein lohnenswerterer Ansatz: Nimm doch ein Objekt vom Typ TCriticalSection. Dort ist alles artig gekapselt und Du musst nur .Enter / .TryEnter / .Leave aufrufen. Funktioniert in meinen Augen zuverlässig wie ein Panzer.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Probleme mit Enter/LeaveCriticalSection

  Alt 21. Sep 2016, 08:13
Bei Logs finde ich eine asynchrone Lösung sinnvoller. Das heißt ich nehme einen Thread, der nur die Logs schreibt und synchronisiere in irgendeiner Form mit diesem Thread um die Daten asynchron dort hineinzupacken.
Zum Beispiel mit TThread.Queue(LogThread, ...) oder indem Windows Messages geschickt werden oder...

Das hat den Vorteil, dass die sendenden Threads nicht blockiert werden.

Ob TCriticalSection oder direkt die API-Funktionen macht vom Ergebnis her keinen Unterschied, da TCriticalSection diese nur kapselt. Allerdings ist es natürlich sinnvoll TCriticalSection zu verwenden um für andere Betriebssysteme gerüstet zu sein.

Der Quelltext wie er jetzt ist sieht aber eigentlich korrekt aus.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.603 Beiträge
 
Delphi 12 Athens
 
#5

AW: Probleme mit Enter/LeaveCriticalSection

  Alt 21. Sep 2016, 08:50
Eine CriticalSection blockt zuverlässig alles ab, was da rein will - unabhängig davon, wo es herkommt.
Das ist formell nicht ganz richtig. Eine CriticalSection kann immer nur von einem Thread durchlaufen werden, von diesem allerdings auch mehrmals - andernfalls könnte der Thread sich selbst dead-locken. Ein innerhalb der gezeigten CriticalSection rekursiv aufgerufenes WriteLnLog würde also problemlos funktionieren und genau das gezeigte Phänomen erzeugen.

Der gezeigte Code fällt allerdings offenbar nicht darunter, aber andererseits ist er auch nicht mal compilierbar.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
263 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Probleme mit Enter/LeaveCriticalSection

  Alt 21. Sep 2016, 09:02
Hallo,

dass der code nicht compilierbar ist ist richtig: ich habe ihn auch auf die wesentlichen Punkte runter gestrippt um zu zeigen wo mein Problem ist.

Aber wie bekomme ich das Ding denn nun wirklich so zu, dass der Code nicht parallel durchlaufen werden kann?
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Probleme mit Enter/LeaveCriticalSection

  Alt 21. Sep 2016, 09:08
dass der code nicht compilierbar ist ist richtig: ich habe ihn auch auf die wesentlichen Punkte runter gestrippt um zu zeigen wo mein Problem ist.
Eventuell hast du genau den entscheidenden Fehler dabei korrigiert. Denn so sieht es so aus als ob der Fehler so nicht kommen kann.

Versuch doch mal den Code so zu kürzen, dass er im Wesentlichen noch funktioniert und schaue ob das Problem noch auftritt. Wenn ja, kannst du dann den Code 1:1 zeigen, der das Problem verursacht.
Bzw. wenn du möchtest, kannst du den auch so wie er ist posten.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Probleme mit Enter/LeaveCriticalSection

  Alt 21. Sep 2016, 09:10
Mit der CriticalSection stellst Du ja schon mal sicher, dass sich verschiedene Threads nicht gegenseitig in die Quere kommen. Zur Not nutzt Du mal ein boolsches Flag, um zu erkennen, wer da wie oft rein will. Das ist keine beständige Lösung, könnte Dir aber einen schnellen Erkenntnisgewinn bringen, wenn Du einen Breakpoint auf die Stelle setzt, an der er ein zweites Mal rein will und Dir dann den Callstack ansiehst.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
zagota

Registriert seit: 3. Sep 2014
38 Beiträge
 
#9

AW: Probleme mit Enter/LeaveCriticalSection

  Alt 21. Sep 2016, 10:19
Timer? Doch, geht. Eine CriticalSection blockt zuverlässig alles ab, was da rein will - unabhängig davon, wo es herkommt.
Hab mal eine kleine Demo gebaut(D2010):

Es kommt 2x "enter", das Programm läuft natürlich in einer Endlosschleife.

Wo liegt mein Denkfehler?

Delphi-Quellcode:
var
  CritcalSection: TCriticalSection;

implementation

{$R *.dfm}

procedure TForm6.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := True;
  CS;
end;

procedure TForm6.CS;
begin
  CritcalSection.Enter;
  try
    OutputDebugString('enter');

    while True do
    begin
      Application.ProcessMessages;
      sleep(100);
    end;

  finally
    CritcalSection.Leave;
    OutputDebugString('leave');
  end;
end;

procedure TForm6.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  CS;
end;

initialization
  CritcalSection := TCriticalSection.Create;
finalization
  CritcalSection.Free;
end.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Probleme mit Enter/LeaveCriticalSection

  Alt 21. Sep 2016, 10:22
Mach es mit Threads und ohne Timer.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 03: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 by Thomas Breitkreuz