Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 05:05

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Fehlerabfrage/LogFile
BeitragVerfasst: Sa Apr 03, 2004 21:34 
Offline
DGL Member

Registriert: Mi Mär 24, 2004 16:45
Beiträge: 29
Hi,

ich bin grad dabei n schönes game zu coden und komme auch gut voran.
Doch bei vielen Leuten stürtzt mein spiel einfach ab und ich weiss nicht woran es liegt...
Also mache ich jetzt eine LogFile funktion rein damit ich sehen kann wo der fehler auftritt. Erst dachte ich ey voll easy und jetzt fühl ich mich wie der letzte nub :(
Also ich benutze AssingFile und ReWrite um die datei zu erstellen und am ende vom prog CloseFile .. dass alles mit nem file vom type TextFile.
Wenn das prog dann wirklich absäuft, steht da nur das halbe log drinne irgentwo total unlogisch abgebrochen.

Dummerweise hab ich kein bisl erfahrung mit solcher art von problemen ... könnte auch irgentwas mit thread verwaltung zu tun haben von der ich auch keine ahnung hab. Aber meine Eigentliche Frage ist, ob es eine möglichkeit gibt wenn das prog abstürtzt noch was ins Log zu schreiben ?

Ich denke mal das hier bestimmt viele erfahrung mit sowas haben und mir vielleicht ne einfache lösung sagen können .. oder n opensource von irgentwas wo ich das draus lernen kann

danke schonma


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 03, 2004 21:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Für zuverlässiges Logging musst du die Datei logischerweise nach jedem neuen Log-Eintrag auf die Platte speichern, denn beim Absturz deiner Anwendung ist ja nicht mehr garantiert das die Datei noch korrekt geschlossen (geschrieben) wird.
Am besten macht man das über eine TStringList, die man dann nach jedem Logeintrag via SaveToFile auf die Platte schreibt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 03, 2004 21:40 
Offline
DGL Member

Registriert: Mi Mär 24, 2004 16:45
Beiträge: 29
ahh genau ... hatte auch schon versucht dass jedes ma neu zu schreiben aber hatte irgentwelche errors ... aber mit StringList hab ichs noch nich probiert ... thx


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 03, 2004 21:43 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Mach um deine Hauptschleife einen try finally Block. Egal welche Exception auftritt, der finally Abschnitt wird immer ausgeführt.

Code:
  1. try
  2.  AssignFile(f,...);
  3.  Rewrite(f);
  4.  // Spiel laufen lassen
  5. finally
  6.  CloseFile(f);
  7. end;


Anstelle irgendeiner neudefinierten Variablen für die Textdatei kann man auch die vordefinierte Variable Output benutzen. Wenn man bei Write und Writeln keine Datei angibt, dann wird die Variable Output verwendet. Der Vorteil davon ist, daß man sich Schreibarbeit spart und das nicht jede Unit die in die Log Datei schreiben will, auch die Unit mit der Datei einbinden muß. Output ist nämlich in der Unit System und die wird immer automatisch eingebunden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 03, 2004 22:08 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
also das problem, mit den angefressenen logfiles ist, dass die textdateifunktionen von delphi die dateien stückweise cached - wie sich das gehört. mit einem gezielt eingesetztem flush nach einem schreibbefehl, sollte sich das problem lösen. notfalls in der hilfe nochmal nachschauen, wie der befehl heisst, aber mit flush bin ich mir ziemich sicher, kanns aber gerade nicht ausprobieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 03, 2004 22:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Sonst, für LogFiles hab ich mir diese Klasse gemacht:
Code:
  1.  
  2. unit LogFile;
  3.  
  4. interface
  5.  
  6. uses
  7.   SysUtils, Classes;
  8.  
  9. type TLogFile = class
  10.   private
  11.     fFileName: String;
  12.     fReWrite: Boolean;
  13.   public
  14.     property FileName: String read fFileName write fFileName;
  15.     property ReWrite: Boolean read fReWrite write fReWrite;
  16.     constructor Create(FileName: String; ReWrite: Boolean);
  17.     procedure Write(const Text: String);
  18. end;
  19.  
  20. implementation
  21.  
  22. constructor TLogFile.Create(FileName: String; ReWrite: Boolean);
  23. begin
  24.   fFileName := FileName;
  25.   fReWrite := ReWrite;
  26.   Write('Logfile \"' + fFileName + '.htm\" initialized.');
  27. end;
  28.  
  29. procedure TLogFile.Write(const Text: String);
  30. var
  31.   TargetFile: TStringList;
  32. begin
  33.   TargetFile := TStringList.Create;
  34.   if ReWrite then
  35.   begin
  36.     TargetFile.Add('<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">');
  37.     TargetFile.Add('<html><head><title>Logfile</title></head><body>');
  38.   end else
  39.   begin
  40.     if FileExists(fFileName + '.htm') then
  41.     begin
  42.       TargetFile.LoadFromFile(fFileName + '.htm');
  43.       TargetFile.Delete(TargetFile.Count - 1);
  44.     end else
  45.       TargetFile.Add('<html><head><title>Logfile</title></head><body>');
  46.   end;
  47.   TargetFile.Add('<span style=\"color:#ff0000\">' + DateToStr(now) + ', ' + TimeToStr(now) + ':</span> ' + Text + '<br>');
  48.   TargetFile.Add('</body></html>');
  49.   TargetFile.SaveToFile(fFileName + '.htm');
  50.   TargetFile.Free;
  51. end;
  52.  
  53. end.
  54.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 04, 2004 09:19 
Offline
DGL Member

Registriert: Di Dez 30, 2003 18:16
Beiträge: 6
Das mit der Standard-Ausgabe klingt interressant.

Kann man die Ausgabe auch auf ne funktion zeigen lassen oder so?

Also ich gebe mit writeln('...'); was aus und will das jetzt mit meiner Log Klasse abfangen um noch nen TimeStamp etc. hinzuzufügen. Das dann in eine Datei speichern is ja kein problem, aber kann ich das dann zusätzlich noch auf der Konsole ausgeben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 04, 2004 11:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Alle Text File Typen sind in Wirklichkeit vom Type TTextRec. Die Standardfunktionen rufen bei der Ausgabe die entsprechenden Funktionen in dem TTextRec auf.

Code:
  1.   TTextRec = packed record
  2.     Handle: Integer;
  3.     Mode: Word;
  4.     Flags: Word;
  5.     BufSize: Cardinal;
  6.     BufPos: Cardinal;
  7.     BufEnd: Cardinal;
  8.     BufPtr: PChar;
  9.     OpenFunc: Pointer;
  10.     InOutFunc: Pointer;
  11.     FlushFunc: Pointer;
  12.     CloseFunc: Pointer;
  13.     UserData: array[1..32] of Byte;
  14.     Name: array[0..259] of Char;
  15.     Buffer: TTextBuf;
  16.   end;


Die 4 Funktionen habe alle folgende Signatur:
Code:
  1.  function DeviceFunc(var F: TTextRec): Integer;
Da kann man jetzt auch seine eigene Funktion zuweisen, die dann die Ausgabe entsprechend umleitet. Das wird z.B. in der unit Printers gemacht. Wenn man dann diesen TTextRec noch der Variablen Output zuweist ist das die neue Standardausgabe. Die genaue Erklärung zu den 4 Funktionen ist in der Delphi Hilfe unter Text-file device drivers zu finden. So wird da z.B. eine neue Textdatei erstellt und die Funktionen DevOpen,DevInOut,DevFlush und DevClose zugewiesen. Bei den Log Dateien kann man außer DevInOut eigentlich alles übernehmen. Der auszugebene Text steht dann in dem Buffer des übergebenen TTextRec.

Code:
  1.  
  2. procedure AssignDev(var F: Text);
  3. begin
  4.   with TTextRec(F) do
  5.   begin
  6.     Mode := fmClosed;
  7.     BufSize := SizeOf(Buffer);
  8.     BufPtr := @Buffer;
  9.     OpenFunc := @DevOpen;
  10.     InOutFunc := @DevInOut;
  11.     FlushFunc := @DevFlush;
  12.     CloseFunc := @DevClose;
  13.     Name[0] := #0;
  14.   end;
  15. end;


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]