![]() |
TFileStream.Create vs. FileCreate
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:
Das läuft beim Kunden wunderbar, aber mir geht das auf die Nerven, dass ich ständig Debugger-Exceptions bekomme.
begin
Result := nil; lOpen := false; repeat try Result := TFileStream.Create('LOCKFILE.DAT', fmOpenReadWrite or fmShareExclusive); lOpen := true; except Sleep(200); end; until lOpen; end; 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:
Das hat bei mir wunderbar funktioniert und ich war die lästigen Exceptions los,
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; 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 |
AW: TFileStream.Create vs. FileCreate
Erst mit
![]() und wenn erfolgreich in ein ![]() Der Rückgabewert der Funktion als TStream ist sowieso optimaler. (egal was für eine Klasse letzendlich drin steckt) |
AW: TFileStream.Create vs. FileCreate
Ich kann irgendwie noch nicht verstehen, wie die
Delphi-Quellcode:
Schleife im
repeat
Delphi-Quellcode:
Fall funktionieren soll, wenn sie mit
INVALID_HANDLE_VALUE
Delphi-Quellcode:
abgeschlossen wird.
until (True)
|
AW: TFileStream.Create vs. FileCreate
Das macht so überhaupt keinen Sinn. Wenn du die Exception nicht möchtest, öffne einfach selbst das Handle und schließe es nicht wieder. Dann übergibst du das Handle einem THandleStream und schon kannst du deine Anforderung "keine Exception im Fehlerfall" ganz sauber lösen und hast einen Stream wie auch vorher mit dem Filestream.
Denn sobald das Handle zu ist, könnte es jemand anders zufälligerweise öffnen bevor dein Filestream geöffnet wird und deine ganze Vorabfrage ist für die Katz. |
AW: TFileStream.Create vs. FileCreate
Jooo, WHILE vs. REPAT-UNTIL.
WHILE True = Schleife ausführen wenn True (False = überspringen) UNTIL True = Schleife beenden wenn True (False = nochmal) ... du wolltest also eigentlich UNTIL False Bzw., wenn man nicht den Unterschied, sondern die "eigentliche" Gemeinsamkeit betrachten will: = bei True weiter mit nächster Zeile/Anweisung * WHILE : in die nachfolgende Schleife rein * UNTIL : aus der vorhergehenden Schleife raus Warum mit EXIT rumpfuschen, anstatt direkt UNTIL iHdl = INVALID_HANDLE_VALUE. Und dann nach der Schleife schließen, bzw. besser direkt an den mehrfach genannten THandleStream. |
AW: TFileStream.Create vs. FileCreate
Du kannst im debugger auch nur bei bestimmten exceptions anhalten lassen.
Ich bin leider unterwegs, daher kann ich dir den Menüpunkt nicht sagen. Es kann sein, dass ich das auch in meinen Tutorial Videos auf YT Mal gezeigt habe. Edit: Schau hier Mal die Screenshots an: Optionen, debugger, ignore exceptions ![]() |
AW: TFileStream.Create vs. FileCreate
Zitat:
Zitat:
|
AW: TFileStream.Create vs. FileCreate
Zitat:
Zitat:
Zitat:
produziert hat habe ich nun eh Verbot da was einzubauen / zu ändern. Ich hätte nur gerne verstanden warum das nun so eskaliert ist. Das in den 10 ms zwischen FileClose und TFileStream.Create jemand zwischen grätschen kann ist mir hierfür tatsächlich total egal, weil vernachlässigbar. Dann greift halt das "alte" Try-Except, was vorher schon da war. |
AW: TFileStream.Create vs. FileCreate
Zitat:
Wenn du nur Probleme mit der Debugger-Exception hast, dann klammere deine (hoffentlich korrigierte) Lösung doch einfach in ein
Delphi-Quellcode:
. Dann hast du Ruhe und der Kunde bekommt davon nichts mit.
{$IFDEF DEBUG}
|
AW: TFileStream.Create vs. FileCreate
Leider wird das Debug-Compilat bei unseren Anwendungen für etwas anderes verwendet.
Die Idee mit dem THandleStream sag gut aus, aber leider gibt der das Handle nicht mehr selbstständig frei. Jetzt haben die Kollegen hier zeitgleich auch noch in Massen Sachen gebaut, bei dem es in einer Tour zu Debugger-Exceptions kommt. Mir bleibt ja eh nichts als die jetzt wie alle anderen zu deaktivieren. Fehlersuchen werden (für mich zumindest) damit nochmal eine ganze Ecke schwieriger. Um dem Ganzen noch einen drauf zu setzen: Wenn ich mit meiner Funktion das FileCreate "nur" verdoppel, funktioniert das Tray-Icon vom Programm nicht mehr (er reagiert nicht mehr auf OnClick). Ich glaube ich mache eine Umschulung als Blumengießer, das ist mir zu hoch. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 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