![]() |
AW: Programm stürzt nach mehren Stunden Laufzeit ab.
In diesem Bereich würde ich mal weiterschauen, hier scheint es ja einen Handlezuwachs zu geben:
Code:
Protokolliere bitte in jeder Zeile auch die Handles, damit man sehen kann, bei welchem Schritt ein Zuwachs entsteht.
07.09.2021 17:09:27: (Debug) PrinServer_action fertig: Handles: 354
07.09.2021 17:09:30: (Debug) : LS Download von Server OK: FranceTest.pdf 07.09.2021 17:09:30: (Debug) : LS Download von Server OK: SwissTest.pdf 07.09.2021 17:09:31: (Debug) : LS Download von Server OK: GermanTest.pdf 07.09.2021 17:09:31: (Debug) Druckbefehl (LS) gesendet: GermanTest.pdf 07.09.2021 17:09:36: (Debug) Druckbefehl (LS) gesendet: SwissTest.pdf 07.09.2021 17:09:41: (Debug) Druckbefehl (LS) gesendet: FranceTest.pdf 07.09.2021 17:09:47: (Debug) : RE Download von Server OK: FranceTest.pdf 07.09.2021 17:09:47: (Debug) : RE Download von Server OK: SwissTest.pdf 07.09.2021 17:09:48: (Debug) : RE Download von Server OK: GermanTest.pdf 07.09.2021 17:09:48: (Debug) Druckbefehl (RE) gesendet: GermanTest.pdf 07.09.2021 17:09:54: (Debug) Druckbefehl (RE) gesendet: SwissTest.pdf 07.09.2021 17:09:59: (Debug) Druckbefehl (RE) gesendet: FranceTest.pdf 07.09.2021 17:10:04: (Debug) : ET1 Download von Server OK: FranceTest.pdf 07.09.2021 17:10:05: (Debug) : ET1 Download von Server OK: SwissTest.pdf 07.09.2021 17:10:05: (Debug) : ET1 Download von Server OK: GermanTest.pdf 07.09.2021 17:10:05: (Debug) Druckbefehl (ET1) gesendet: GermanTest.pdf 07.09.2021 17:10:10: (Debug) Druckbefehl (ET1) gesendet: SwissTest.pdf 07.09.2021 17:10:15: (Debug) Druckbefehl (ET1) gesendet: FranceTest.pdf 07.09.2021 17:10:21: (Debug) : ET2 Download von Server OK: FranceTest.pdf 07.09.2021 17:10:21: (Debug) : ET2 Download von Server OK: SwissTest.pdf 07.09.2021 17:10:22: (Debug) : ET2 Download von Server OK: GermanTest.pdf 07.09.2021 17:10:22: (Debug) Warte auf beendigung des PrintServer Vorgang... 07.09.2021 17:10:22: (Debug) PrinServer_action fertig: Handles: 475 07.09.2021 17:10:22: (Debug) Druckbefehl (ET2) gesendet: GermanTest.pdf 07.09.2021 17:10:28: (Debug) Druckbefehl (ET2) gesendet: SwissTest.pdf 07.09.2021 17:10:33: (Debug) Druckbefehl (ET2) gesendet: FranceTest.pdf Das könnte z. B. in der Routine Start_Bat sein. Da bitte am Anfang und am Ende die Handles protokollieren, dann kann man erkennen, ob der Handlezuwachs durch den Aufruf von ShellExecute entsteht, was mich zwar verwundern würde, aber man weiß ja nie ;-)
Delphi-Quellcode:
Eventuell könntest Du aber auch Addline_Debug ergänzen, dann wird der Änderungsaufwand geringer:
procedure start_bat(s:string);
begin Addline_Debug(Format('Beginne start_bat(%s',[s])); if Form1.CheckBox_verstecke_cmd.Checked then ShellExecute(Application.Handle, 'open',PChar(S), nil, nil, SW_HIDE) else ShellExecute(Application.Handle, 'open',PChar(S), nil, nil, SW_NORMAL); Addline_Debug(Format('Beende start_bat(%s',[s])); end;
Delphi-Quellcode:
Ansonsten sehe ich momentan keine Stelle, an der ich mit einem Handlezuwachs rechnen würde. Aber das heißt ja nix.
// Je nach Delphi ist's auch schon in Winapi.Windows zu finden:
function GetProcessHandleCount(hProcess: THandle; var pdwHandleCount: DWORD): BOOL; stdcall; external 'kernel32.dll'; procedure Addline_Debug(s: String); var HandleCount: DWORD; begin if Form1.CheckBox_DebugLog.Checked then begin if GetProcessHandleCount(GetCurrentProcess, HandleCount) then begin addline(Format('(Debug) %s (Handles: %d)', [s, HandleCount])); end else begin addline(Format('(Debug) %s', [s])); end; end; end; procedure LogHandles(s : String); var HandleCount: DWORD; begin if GetProcessHandleCount(GetCurrentProcess, HandleCount) then Addline_Debug(Format('%s: Handles: %d',[s, HandleCount])); end; Und dann ändere bitte noch die Zeile
Delphi-Quellcode:
ts_log.SaveToFile(programmpfad + 'log_OLD.txt');
in
Delphi-Quellcode:
ts_log.SaveToFile(Format('%s%s.log',[programmpfad,FormatDateTime('YYYYMMDD_HHNNSS.ZZZ',Now)]));
Damit bekommst Du dann eine Logfilehistorie und kannst dadurch das Geschehene auch über einen längeren Zeitraum protokollieren, musst allerdings dann die Logdateien manuell löschen, da sie nicht mehr überschrieben werden. |
AW: Programm stürzt nach mehren Stunden Laufzeit ab.
Ich würde mal die ganzen Proceduren und Functionen zu deiner Class addieren dann kannst du dir die ganzen Aufrufe Form1 ersparen.
Delphi-Quellcode:
private
procedure addline(s: string);
Delphi-Quellcode:
Nur ein Vorschlag.
procedure TForm1.addline(s: string);
var ts_log: tstringlist; begin ts_log := tstringlist.Create; try try Memo_Log.Lines.Add(Format('%s: %s', [datetimetostr(now), s])); // vorher Form1.Memo_Log.Lines.Add Das gleiche gilt für die globalen Variablen.
Delphi-Quellcode:
procedure PrinServer_action;
soll bestimmt
Delphi-Quellcode:
procedure PrintServer_action;
heißen. Zitat:
Da ist nix mit Freigeben. Nebenbei er könnte sich ja mal ![]() |
AW: Programm stürzt nach mehren Stunden Laufzeit ab.
Ok, Habe heute morgen versucht eure Vorschläge einzubauen/anzupassen.
Zitat:
Zitat:
LogFiles des Programm: ![]() ![]() ![]() Gestern ist das Programm im Geschäft 2x Abgestürtzt (jedoch noch die alte version) Handles gemäss Taskmanager während das programm eingefroren war: 328 und 324. Ich frage mich langsam ob es wirklich an den Handles liegt oder ob evt ein Computer spezifisches Problem vorliegt? ---> falls jetzt die neue Version heute oder morgen wieder abstürtzt, werde ich es einmal auf einem anderen Computer laufen lassen. In der .Bat steht übrigens folgendes: (falls das noch ein problem sein könnte?)
Code:
ET1\PDFtoPrinter ACTUAL_PRINT.pdf "Zebra Etiketten"
wait exit ![]() |
AW: Programm stürzt nach mehren Stunden Laufzeit ab.
Nur eine Bitte: Kannst du uns die Scroll-Orgien ersparen und einfach die PAS-Datei als Anhang mitgeben?
|
AW: Programm stürzt nach mehren Stunden Laufzeit ab.
Beim Logging sehe ich das Problem, dass ja nur alle 5000 Zeilen gespeichert wird.
Bei einem Programmabsturz kann man also schlimmstenfalls die letzten 5000 Zeilen im Protokoll nicht nachvollziehen. Die letzten Infos vor dem Auftreten eines Fehlers gehen also verloren. Daher ein Vorschlag für die Änderung der Fehlerprotokollierung (nur hingedaddelt und nicht getestet):
Delphi-Quellcode:
Memo_Log wird zur Fehlerprotokollierung nicht mehr benötigt.
procedure TForm1.AddLine(s : String);
var f : TextFile; iIOResult : Integer; sLogFile : String; begin // Der Name der LOG-Datei ändert sich stündlich. // Wir schreiben die Meldungen sofort in eine Datei und speichern diese sofort. // Dadurch sollte auch die letzte Meldung vor dem Auftreten eines Fehlers // in der Datei einhalten sein. sLogFile := Format('%s%s.log',[programmpfad,FormatDateTime('YYYYMMDD_HH',Now)]); iIOResult := 0; {$I-} AssignFile(f,sLogFile); try try if not FileExists(sLogFile) then begin ReWrite(f); iIOResult := IOResult; end else begin Append(f); iIOResult := IOResult; end; if iIOResult = 0 then begin WriteLn(f,FormatDateTime('yyyy.mm.dd hh.nn.ss,zzz',now),': ',s); Flush(f); iIOResult := IOResult; CloseFile(f); iIOResult := IOResult; iIOResult := 0; end; except on e : EOsError do MessageDLG(e.Message + #13#13 + SysErrorMessage(GetLastError),mtError,[mbOk],0); on e : Exception do MessageDLG(e.Message,mtError,[mbOk],0); end; finally if (iIOResult <> 0) and (iIOResult <> 32) then begin MessageDLG(Format('Fehler %d in AddLine.',[iIOResult]),mtError,[mbOK],0); end; end; {$I+} end; Absonsten kann ich momentan beim besten Willen nicht erkennen, woher da ein Programmabsturz ... kommen könnte. Achso: Die Handles können ein Indikator für ein grundlegendes Problem sein, müssen es aber nicht. Ein computerspezifisches Problem würd' ich hier eher nicht vermuten. Eher im Umfeld mit der FTP-Kommunikation. ShellExecute ist 'ne Funktion, deren Rückgabewert man auswerten kann ( ![]()
Delphi-Quellcode:
procedure Tform1.start_bat(s:string);
var iShellEx : Integer; iSW : Integer; begin LogHandles('start_bat_begin'); case CheckBox_verstecke_cmd.Checked of true : iSW := SW_HIDE; false : iSW := SW_NORMAL; end; iShellEx := ShellExecute(Application.Handle, 'open', PChar(S), nil, nil, iSW); AddLine_Debug(Format('ShellExecute: %s Rückgabewert: %d',[s,iShellEx])); LogHandles('start_bat_ende'); end; |
AW: Programm stürzt nach mehren Stunden Laufzeit ab.
Ein ähnliches Problem hatte ich auch mal. Allerdings hat er dann bei dem Versuch irgendwas in der GUI zu machen eine Exception geworfen. Im ersten Beitrag steht ja das die relevante Funktion die als letztes aufgerufen wird in einem try except Block steht. Wenn ich das richtig verstanden habe. Das würde glaube jede Exceptionmeldung natürlich unterdrücken. Die Exe im Debug mode zu kompilieren macht ja auch noch ein Unterschied.
Ich hatte auch alles nach Speicherlecks durchsucht. Aber die Ursache war letztendlich der Speicherort von dem aus das Programm gestartet wurde. Der Fehler ist nur aufgetreten, wenn das Programm aus dem Netzwerk gestartet wurde. Das selbe könnte für Wechseldatenträger gelten. |
AW: Programm stürzt nach mehren Stunden Laufzeit ab.
Zitat:
Ich habe nun einiges abgeändert und zudem die ganze FTP Geschichte in einen eigenen Thread gesetzt. Dieser Thread startet sich am ende von selbst neu und falls er das nicht mehr tut (warum auch immer) so startet ein Timer den Thread manuell neu. Ich VERMUTEes hing vorher irgendwie damit zusammen das ich die Dateien unbenannt habe und dann schnellstmöglich löschen wollte. Den diese beiden Sachen habe ich nun weggelassen trotz das sie eigentlich im try/except standen... Dateien werden nun nicht mehr unbenannt und werden auch erst bei Programmende gelöscht. Seitdem läuft das Programm nun :thumb: Obwohl meine Lösung / Programmierung bestimmt sehr amateurhaft ist, poste ich hier noch der funktionierende Code um dieses Thema hier abschliessen zu können. VIELEN DANK AN ALLE für eure Hilfe. :thumb: ![]() |
AW: Programm stürzt nach mehren Stunden Laufzeit ab.
Na ja die ganzen Form1 sind immer noch drin.. Warum?
Du befindest dich doch schon innerhalb der Classe Tform1 Lösche den Kram doch einfach. ;) das
Delphi-Quellcode:
ts.Add(Form1.Edit_Host.Text);
zu
Delphi-Quellcode:
ts.Add(Edit_Host.Text);
usw.. Überprüfe den gesamten Quelltext nochmal Das tform1 zu TForm1 um eine einheitliche Schreibweise zu erhalten (aber nicht Lebenswichtig nur als Tip nebenbei) Zumindest macht es den Quelltext lesbarer.
Delphi-Quellcode:
end;
procedure tform1.savesettings;
var ts: tstringlist; begin ts := tstringlist.Create; try try ts.Add(Form1.Edit_Host.Text); ts.Add(Form1.Edit_User.Text); ts.Add(Form1.Edit_Password.Text); ts.Add(Form1.Edit_Port.Text); ts.Add(Form1.Edit_LS.Text); ts.Add(Form1.Edit_RE.Text); ts.Add(Form1.Edit_ET1.Text); ts.Add(Form1.Edit_ET2.Text); ts.Add(Form1.Edit_verbindungsDAUER.Text); ts.Add(form1.Edit_pause_pro_durchgang.Text); ts.Add(Form1.Edit_pause_wiederverbindung.Text); ts.Add(Form1.Edit_druck_pauseDEA.Text); ts.Add(Form1.Edit_rechnungen_max.Text); ts.Add(Form1.Edit_papierfach_max.Text); ts.Add('tray:off'); ts.Add(IfThen(CheckBox_autostart.Checked, 'autostart:on','autostart:off')); ts.Add(IfThen(CheckBox_DebugLog.Checked, 'debug:on','debug:off')); ts.Add(IfThen(CheckBox_verstecke_cmd.Checked, 'hidecmd:on','hidecmd:off')); ts.Add(inttostr(papierfach)); ts.Add(inttostr(rechnungsfach)); ts.Add(''); ts.SaveToFile(programmpfad + 'settings.txt'); except on e: exception do form1.addline('Fehler beim speichern der Einstellungen: ' +e.Message); end; finally ts.free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 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-2025 by Thomas Breitkreuz