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!