• Leider kommt es in meinem Programm hin und wieder vor, dass die kompilierte exe nicht ordentlich beendet wird. Im Taskmanager springt die CPU Auslastung des Prozesses dann auch plötzlich auf 50% als ob das Programm in einer Endlosschleife hängen würde. Die GUI verschwindet und auch der FF Prozess verschwindet. Übrig bleibt nur der Prozess des Hauptprogramms mit der erwähnten CPU Auslastung.

    Nun habe ich mir mal die Funktion _FFQuit angesehen, aber dort kann ich keine Schleife erkennen, die zum Beispiel aufs verschwinden des FF Prozesses wartet. Jedoch sind mir einige ungewöhnliche if ... then Konstrukte aufgefallen (Zeile 22 und 32), die offensichtlich nicht mit endif enden sondern nur mit einem return. Da der compiler aber keinen Syntax Fehler feststellen kann gehe ich davon aus, dass das so ok sein müsste.

    Kann das dennoch daran liegen?

    [autoit]

    ; #FUNCTION# ===================================================================
    ; Name ..........: _FFQuit
    ; Description ...: Quits FireFox
    ; Beschreibung ..: Schließt FireFox
    ; AutoIt Version : V3.3.0.0
    ; Syntax ........: _FFQuit()
    ; Parameter(s): .:
    ; Return Value ..: Success - 1 / $_FF_GLOBAL_SOCKET = -1
    ; Failure - 0
    ; @ERROR -
    ; Author(s) .....: Thorsten Willert
    ; Date ..........: Sat Mar 14 14:44:55 CET 2009 @614 /Internet Time/
    ; Link ..........:
    ; Related .......: _FFDisConnect
    ; Example .......: Yes
    ; ==============================================================================

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _FFQuit()
    Local Const $sFuncName = "_FFQuit"

    [/autoit][autoit][/autoit][autoit]

    If $_FF_GLOBAL_SOCKET = -1 Then Return
    If Not __FFIsSocket($_FF_GLOBAL_SOCKET) Then
    SetError(__FFError($sFuncName, $_FF_ERROR_SocketError))
    Return 0
    EndIf

    [/autoit][autoit][/autoit][autoit]

    TCPSend($_FF_GLOBAL_SOCKET, "close()" & @CRLF)
    If Not @error Then
    $_FF_FRAME = "top"
    $_FF_GLOBAL_SOCKET = -1
    If $_FF_COM_TRACE Then ConsoleWrite('__FFQuit: Closing FireFox ...' & @CRLF)
    Return 1
    Else
    Return 0
    EndIf

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Hallo,

    die Funktion sendet einfach nur ein einen Befehl zum Schließen an FireFox. Leider ist es nicht so einfach möglich zu überprüfen ob der FireFox-Prozess nun von der FF.au3 gestartet wurde, oder ob man per Hand zwischenzeitlich ein neues FireFox-"Fenster" geöffnet hat, darum findet auch keine Überprüfung des Prozesses statt.

    Die Ifs sind doch alle richtig, wo soll denn da ein EndIf fehlen?

    Grüße
    Stilgar

  • Konnte das nun auch im Scite Editor nachstellen. In der Console bleibt er bei Closing Firefox hängen, obwohl der FF Prozess längst ordnungsgemäß beendet wurde, der exit Befehl der direkt nach ffquit folgt wird nicht ausgeführt. Daher ja mein Verdacht dass es Probleme in der ffquit Funktion geben muss.

    Code
    __FFSend: try{gBrowser.tabContainer.selectedIndex = 0}catch(e){'_FFCmd_Err';};
    __FFRecv: 0
    __FFSend: try{gBrowser.tabContainer.selectedIndex = 0}catch(e){'_FFCmd_Err';};
    __FFRecv: 0
    __FFQuit: Closing FireFox ...
    
    
    >Process failed to respond; forcing abrupt termination...
    >Exit code: 1    Time: 619.468

    Was ich mit der if Sache meinte ist zum Beispiel diese Zeile, welche nicht mit einem endif abgeschlossen sondern mit einem return abgeschlossen wird:

    [autoit]

    If $_FF_GLOBAL_SOCKET = -1 Then Return

    [/autoit]


    oder auch hier:

    [autoit]

    If $_FF_COM_TRACE Then ConsoleWrite('__FFQuit: Closing FireFox ...' & @CRLF)

    [/autoit]

    Aber scheinbar erlaubt das die autoit Syntax? War jedenfalls mein einzigster Gedanke, nachdem dort keine Schleifen vorkommen und das Programm offensichtlich in dieser Funktion hängen bleibt.
    Mittlerweile habe ich im übrigen statt ffquit einfach auf processclosewait umgestellt, seitdem gibt es keine Probleme mehr, somit kann ich eigentlich ausschliessen dass etwas anderes für das Problem verantwortlich ist.

    Einmal editiert, zuletzt von misterspeed (25. Oktober 2010 um 22:14)

  • Man könnte doch das Aktuelle Firefox schließen, mit WinClose, und zwar indem man immer den aktuellen Titel rausbekommt

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Was ich mit der if Sache meinte ist zum Beispiel diese Zeile, welche nicht mit einem endif abgeschlossen sondern mit einem return abgeschlossen wird:

    [autoit]

    If $_FF_GLOBAL_SOCKET = -1 Then Return

    [/autoit]


    oder auch hier:

    [autoit]

    If $_FF_COM_TRACE Then ConsoleWrite('__FFQuit: Closing FireFox ...' & @CRLF)

    [/autoit]


    Aber scheinbar erlaubt das die autoit Syntax?

    Genau. Das steht aber auch so in der Hilfe

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Gut dann mag ich das wohl übersehen haben. Ich Bevorzuge dennoch die vollständige if ... then ... endif Form. Ändert aber nichts am eigentlichen Problem, dass mein Programm sporadisch beim beenden hängenbleibt und 50% CPU Last produziert, wenn die FFQuit Funktion vor dem Exit benutzt wird. Dass es Alternativen wie processWaitClose oder windowclose gibt, weiss ich und habe ich ja bereits entsprechend geändert. Die Frage ist doch aber warum FFQuit nicht genauso funktioniert. Vielleicht wieder eine unerklärliche Win7 Sache...

  • So hab anscheinend doch noch eine Lösung gefunden.

    [autoit]


    _FFQuit()
    Sleep(100)
    Exit

    [/autoit]

    Ohne das "sleep" kommt es sehr häufig zum Hänger, mit sleep konnte ich das bei 10 Testläufen nicht reproduzieren.