Problem beim Beenden eines Programmes (QUIT)

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Problem beim Beenden eines Programmes (QUIT)

Beitrag von Leon »

Ich bekomme hie und da, und das ist leider nicht nachvollziehbar, einen Runtimeerror beim Beenden eines Programmes, genauer gesagt beim Versuch QUIT aufzurufen. Kennt jemand diesen Fehler? Das Programm liegt auf einem Netzwerklaufwerk, die DLLs sind im Verzeichnis der EXE-Datei.

Hier die Errorlogdatei:

Code: Alles auswählen

Xbase++ Version     : Xbase++ (R) Version 1.90.355
Betriebssystem      : Windows 7 06.01 Build 07601 Service Pack 1
------------------------------------------------------------------------------
oError:args         :
oError:canDefault   : N
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
oError:description  : Interne Datenstrukturen besch„digt
oError:filename     : 
oError:genCode      :         41
oError:operation    : _QUIT
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :          5
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von APPQUIT(327)
Aufgerufen von (B)BUTTONMENU(774)
Aufgerufen von DC_XBPPUSHBUTTONXP:ACTION(1448)
Aufgerufen von (B)DC_XBPPUSHBUTTONXP:INIT(225)
Aufgerufen von XBPPUSHBUTTON:HANDLEEVENT(991)
Aufgerufen von DC_GETLIST:EVENTLOOP(4702)
Aufgerufen von DC_GETLIST:READGUI(3869)
Aufgerufen von DC_READGUI(113)
Aufgerufen von BUTTONMENU(1057)
Aufgerufen von MAIN(269)
Hier ist der Quellcode der Funktion zum Beenden des Programmes:

Code: Alles auswählen

/*
 * Routine zum Beenden eines Programms
 */
FUNCTION AppQuit()
   LOCAL oInfo
   local lOk

   lOk := ShowMsgBox( 4, "LBHOTEL beenden?", {"Wollen Sie das Programm beenden?"}, 1)

   IF lOk
      oInfo := ShowInfo():New()
      oInfo:Show("Programmende", "Tempor„rdateien werden entfernt, bitte warten...")
      COMMIT
      CLOSE ALL
      filedelete(cPath + "TEMP????" + ".NTX")
      filedelete(cPath + "XT??????" + ".NTX")
      filedelete(cPath + "YT??????" + ".NTX")
      filedelete(cPath + "ZT??????" + ".NTX")
      oInfo:Destroy()
      QUIT  // Zeile 327, die den Fehler auslöst.
   ENDIF

RETURN .t.             
Gruß aus Wien
Leon
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von hschmidt »

Hallo Leon,

ich hatte früher auch hin und wieder solche Fehler beim Beenden des Programms.
Ich denke, dass es mit dem CLOSE ALL zu tun hat. Ich habe das durch eine PROCEDURE CloseDataBases () ersetzt, die ungefähr so aussieht:

Code: Alles auswählen

PROCEDURE CloseDataBases()
   LOCAL aWS, i

           /*
            * Absichern der shutdown-sequence vor rekursiven Fehlern
            * in DbCommit() udgl.
            */
            aWS := WorkSpaceList()
            FOR i:= 1 TO len(aWS)
                BEGIN SEQUENCE
                  /*
                   * Erzwinge das erfolgreiche Beenden aller
                   * anstehenden Record updates im aktuellen
                   * Workspace.
                   */
                   (aWS[i])->(DbCommit())
                   (aWS[i])->(DbCloseArea())
                RECOVER

                   (aWS[i])->(DbRRollback())
                   (aWS[i])->(DbCloseArea())
                ENDSEQUENCE
            NEXT
RETURN

Seitdem bin ich diese Fehler los...

Viele Grüße

Hans
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Leon »

Hallo Hans, danke für den Tipp, das war´s aber nicht. Der Fehler tritt nach wie vor auf und exact in der Aufrufzeile des QUIT Aufrufs, obwohl ich mit Deiner Funktion zuvor die Datenbanken schließe.
Gruß aus Wien
Leon
BIK
UDF-Programmierer
UDF-Programmierer
Beiträge: 68
Registriert: Di, 23. Aug 2011 14:34
Hat sich bedankt: 1 Mal

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von BIK »

Lass einmal den Threat Showinfo weg und ersetze die beiden Zeilen COMMIT und CLOSE ALL gegen dbCloseAll().
"filedelete" löscht anscheinend mehrere Dateien in einer Schleife im Threat. Ist der Threat fertig bevor du Quit aufrufst?
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Tom »

Ich sehe da keinen Thread.

DbCloseAll() oder CLOSE DATABASES laufen zuweilen auf Probleme, wenn Relationen gesetzt sind. Hier empfiehlt es sich, die Workareas zunächst nach Relationen zu durchsuchen und diese zu lösen. Und wenn man das schon macht, kann man in einer ähnlichen Schleife die Tabellen schließen.
Herzlich,
Tom
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Leon »

Es sind keine Relationen vorhanden. Die Funktionen vor dem QUIT laufen auch alle brav durch, Showinfo ist bereits beendet, den Fehler löst definitiv das "QUIT" aus. Lt. Dokumentation werden mit quit alle Dateien in allen Workareas geschlossen, es sind aber zu diesem Zeitpunkt keine Dateien mehr offen.

Ich habe das beim Kunden versucht, irgendwie einzugrenzen. Es scheint so zu sein, dass der Fehler dann auftritt, wenn der Rechner längere Zeit (ca. 2 Stunden lang) nicht benützt wurde und dann versucht wird, dass offene Programm zu beenden. Im Gerätemanager bei den Kundenrechnern sind bei der Netzwerkkarte die Energiespareinstellungen deaktiviertn nur der Bildschirm wird nach einer bestimmten Zeit ausgeschaltet und der Mitarbeiter muss sich neu anmelden, wenn er der Rechner wieder verwendet.
Gruß aus Wien
Leon
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Tom »

Das klingt nach verlorenen/verwaisten Handles. Ursache können auch Connection-Timeouts (lokal oder auf dem Server) sein. Aus diesem Grund öffnen unsere Applikationen im 30-Sekunden-Rhythmus Servicetabellen in einem gesonderten Thread, sperren einen Datensatz und entsperren ihn gleich wieder. Das stellt sicher, dass die Verbindung nicht aus solchen Gründen verlorengeht. Außerdem reagiert unsere ErrorSys auf "Fehler beim Schließen". Das Problem hat man mit dem ADS nicht.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von AUGE_OHR »

Leon hat geschrieben: wenn der Rechner längere Zeit (ca. 2 Stunden lang) nicht benützt wurde und dann versucht wird, dass offene Programm zu beenden.
man benötigt kein QUIT zum beenden einer App ...

wo liegt das EXE ?
wie sind deine TEMP/TMP Einstellungen ? was sagt XppLoad ?

... warum hast du am Schluss filedelete() ? Rückgabe Wert ?
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Tom »

Wenn eine automatische Abmeldung erfolgt, gehen möglicherweise auch Netzwerkfreigaben vorübergehend verloren - und auch dann sind die Handles ungültig. Dass der Fehler in der Quit-Zeile aufzutreten scheint, heißt nicht, dass er auch dort ausgelöst wird.
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Werner_Bayern »

Tom hat geschrieben:Das klingt nach verlorenen/verwaisten Handles. Ursache können auch Connection-Timeouts (lokal oder auf dem Server) sein. Aus diesem Grund öffnen unsere Applikationen im 30-Sekunden-Rhythmus Servicetabellen in einem gesonderten Thread, sperren einen Datensatz und entsperren ihn gleich wieder. Das stellt sicher, dass die Verbindung nicht aus solchen Gründen verlorengeht. Außerdem reagiert unsere ErrorSys auf "Fehler beim Schließen". Das Problem hat man mit dem ADS nicht.
Servus Tom,

genau die Probleme hatten wir auch, haben das ähnlich gemacht, jedoch keine DBF geöffnet, sondern eine Datei angelegt und wieder gelöscht mit fcreate. Hat nichts gebracht.
Passierte auf älteren Rechnern mit Vista und Win7 in Verbindung mit AVG Virenscanner, obwohl das Programm- und Datenverzeichnis ausgenommen waren. Wenn die Rechner über Nacht mit gestarteten Programm liefen, knallte es regelmäßig am nächsten Tag, obwohl alle Energiesparmodi (darauf reagiert auch unser Programm) in Windows, Netzwerkkarte etc. abgeschaltet waren. Erst mit neuer, schnellerer Hardware, Win7 und Win10 sind die Probleme weg. Der AVG-Scan dauert auch nicht mehr > 1 Std., sondern nur noch 6 Minuten (lokal).

Wie reagierst Du in der ErrorSys auf den Fehler beim Schließen (ohne ADS)?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Tom »

Wie reagierst Du in der ErrorSys auf den Fehler beim Schließen (ohne ADS)?
Er wird ignoriert. :wink: Alle Caches dürften längst geflusht sein, das Handle ist ja sowieso weg.
Herzlich,
Tom
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Leon »

AUGE_OHR hat geschrieben:man benötigt kein QUIT zum beenden einer App ...
Wie kann ich sonst eine App korrekt beenden?
AUGE_OHR hat geschrieben: liegt das EXE ?
wie sind deine TEMP/TMP Einstellungen ? was sagt XppLoad ?
EXE und Daten liegen auf einem freigegebenen Netzwerklaufwerk (Windows Server 2008 R2), es sind alle Lese- und Schreibrechte vorhanden. Die Verzecihnisse sind vom Virenscan ausgeschlossen, die TEMP/TMP Einstellungen zeigen auf ein TEMP-Verzeichnis am Laufwerk c: des Arbeitsplatzrechners.
AUGE_OHR hat geschrieben:.. warum hast du am Schluss filedelete() ? Rückgabe Wert ?
Es bleiben immer bei diversen Operationen Tempdateien liegen, die bei Programmende, sofern sie nicht geöffnet sind, entfernt werden. Daher interessiert auch der Rückgabewert nicht.
Gruß aus Wien
Leon
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Herbert »

AUGE_OHR hat geschrieben:
Leon hat geschrieben: wenn der Rechner längere Zeit (ca. 2 Stunden lang) nicht benützt wurde und dann versucht wird, dass offene Programm zu beenden.
man benötigt kein QUIT zum beenden einer App ...
...doch, schon. Falls du z.B. bei Progarammstart diverse Dinge nicht findest (Datenpfade, das Programm läuft bereits, usw.).

Am Ende der Main-Rutine hast ein Return, das genügt.

Denke aber nicht, dass dieses Schlüsselwort Grund ist für deine Probleme.
Grüsse Herbert
Immer in Bewegung...
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: Problem beim Beenden eines Programmes (QUIT)

Beitrag von Leon »

Danke an alle, die Problemlösungen angedacht haben. Ich war gestern wieder beim Kunden und da hat sich herausgestellt, dass ein defekter Switch die Ursache für die Probleme war. Alle Stationen, die an diesem Switch hängen, waren davon betroffen, die anderen Stationen nicht. Switch getauscht -> Problem behoben.
Gruß aus Wien
Leon
Antworten