Moin,
ich habe hier gerade eine Sache, bei der ich echt wahnsinnig werde:
Für einen Locking-Mechanismus hat ein Kollege grob gesagt sowas gebaut:
Delphi-Quellcode:
begin
Result := nil;
lOpen := false;
repeat
try
Result := TFileStream.Create('LOCKFILE.DAT', fmOpenReadWrite or fmShareExclusive);
lOpen := true;
except
Sleep(200);
end;
until lOpen;
end;
Das läuft beim Kunden wunderbar, aber mir geht das auf die Nerven, dass ich ständig Debugger-Exceptions bekomme.
Eine Möglichkeit wäre es disen
Exception-Typ zu ignorieren, aber das finde ich noch bescheuerter.
Meine Idee war (wenn der Rückgabewert ein TFileStream sein muss) das so zu erweitern, dass ich vorher einfach
mit FileCreate versuche die Datei zu öffnen und wenn das geht, dann weiter laufen lasse:
Delphi-Quellcode:
Procedure PreCheck();
var
iHdl : THandle;
begin
while (True) do
begin
iHdl := FileCreate('LOCKFILE.DAT', fmOpenRead or fmShareExclusive);
if (iHdl = INVALID_HANDLE_VALUE) then
begin
Sleep(200);
end else
begin
FileClose(iHdl);
Exit;
end;
end;
end;
begin
Result := nil;
lOpen := false;
repeat
try
PreCheck(); // <- Hier vorab einfach testen
Result := TFileStream.Create('LOCKFILE.DAT', fmOpenReadWrite or fmShareExclusive);
lOpen := true;
except
Sleep(200);
end;
until lOpen;
end;
Das hat bei mir wunderbar funktioniert und ich war die lästigen Exceptions los,
aber jetzt rastet das bei den Kunden aus, weil der WindowsDefender auf 100% hoch läuft.
Alles ist langsam. Der Start des Programms dauert ewig. Alles Mist und es macht für mich 0 Sinn.
Was habe ich bitte falsch gemacht?
Mit frunelichem Gruß
Incocnito