Suche Exit-Strategie für GUI

  • Hallo Community

    Habe folgendes Script für die ISO-Erstellung konzipiert:
    DEMO-Script:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=MKISOFS.ico
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; AutoIt Version: 3.3
    ; Template Version: 90129

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

    Opt("WinWaitDelay", 500)
    Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon
    Opt("MouseCoordMode", 0) ;1=absolute, 0=relative, 2=client
    Opt("ExpandEnvStrings", 1) ;0=don't expand, 1=do expand
    Opt("ExpandVarStrings", 1) ;0=don't expand, 1=do expand
    Opt("WinDetectHiddenText", 0) ;0=don't detect, 1=do detect
    Opt("WinTitleMatchMode", 1) ;1=start, 2=subStr, 3=exact, 4=advanced
    Opt("WinTextMatchMode", 1) ;1=complete, 2=quick

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

    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <Process.au3>
    #include <File.au3>

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

    $exe = "CMD.EXE"
    $indir = "C:\TEST"
    $outfile = "C:\TEST.ISO"
    $fsinmb = "5000"
    $savdrv = "C:"
    $fspace = 10000
    $isofertig = 4900

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

    Example()
    Local $outfile, $isofertig, $isoaktuell, $command, $exe, $delete, $indir, $fsinmb, $space, $savdrv, $fspace, $PID ;
    ;__________________________________________________________________________________________
    Func Example()
    ; Local $outfile, $isofertig, $isoaktuell, $command, $exe, $delete, $indir, $fsinmb, $space, $savdrv, $fspace, $PID ;
    Local $progressbar1, $button, $wait, $s, $msg, $m, $percent, $outsizeupd, $fs, $wtwf, $PID, $elc
    ; MsgBox(0 , "Info", " $savdrv = " & $savdrv & "")
    $PID = ProcessExists($exe)
    $delete = FileExists($outfile)
    If $delete = 1 Then ; file exists
    $fs = "YES"
    Else
    $fs = "NO"
    EndIf
    GUICreate("MKISOFS - PreMastering - 90327", 660, 160, 50, 500) ; erstellt GUI-Fenster so groß wie DOS-Box
    $progressbar1 = GUICtrlCreateProgress(10, 45, 640, 20); Fortschrittsbalken
    $button = GUICtrlCreateButton("START", 20, 110, 80, 30) ; erstellt START-Button ; ID = 4
    GuiCtrlSetBkColor(-1, 0xFFFF00)
    GUICtrlCreateLabel("Source: " & $indir & "", 20, 15) ; ID = 5
    GUICtrlCreateLabel("File: " & $outfile & "", 20, 80) ; ID = 6
    GUICtrlCreateLabel("File exists: " & $fs & "", 450, 80) ; ID = 7
    GUICtrlCreateLabel("Size: " & $fsinmb & " MB", 300, 105) ; ID = 8
    GUICtrlCreateLabel("Output: 0 MB", 288, 130) ; ID = 9
    GUICtrlCreateLabel("Progress: 0 %", 135, 105) ; ID = 13
    GUICtrlCreateLabel("Free Space on " & $savdrv & "\ = " & $fspace & " MB", 450 , 105) ; ID = 80
    GuiCtrlSetBkColor(-1, 0x00CCCC)
    GUISetState(@SW_SHOW) ; startet die GUI
    $wait = 100 ; time in msec to next loop-step
    Do ; Anfang der Schleife (= Anfang der progresssteps ?)
    $msg = GUIGetMsg() ; fragt ob, und was geklickt wurde
    If $msg = $button And GUICtrlRead($Button) <> "DONE" Then ; wenn button-click START
    Run(@ComSpec)
    WinWait("C:\WINDOWS\system32\cmd.exe")
    WinMove("C:\WINDOWS\system32\cmd.exe", "", 50, 100)
    GUICtrlSetData($button, "CANCEL"); ändert label des button in CANCEL
    GuiCtrlSetBkColor(4, 0xFF6600)
    For $i = 0 To 100 ; Schritte von 0 bis 100
    $m = GUIGetMsg() ; fragt ob, und was geklickt wurde
    If $m = -3 Then ExitLoop ; ???
    If $m = $button Then ; wenn button-click CANCEL
    ProcessClose($exe) ; beendet CMD
    Exit ; beendet dieses Script
    Else ; wenn button-click CANCEL nicht erfolgt
    $delete = FileExists($outfile)
    If $delete = 1 Then ; file exists then set electioncolor ($elc)
    $fs = "YES"
    $elc = "0x66FF33"
    Else
    $fs = "NO"
    $elc = "0xFF0000"
    EndIf
    $PID = ProcessExists($exe)
    $space = DriveSpaceFree( $savdrv )
    $fspace = Round ($space, 2)
    $isoaktuell = 950 + $i*40; prüft Dateigröße in kb
    $outsizeupd = Round ($isoaktuell / 1024 / 1024, 2); prüft Dateigröße in MB
    GUICtrlSetData($progressbar1, $isoaktuell/$isofertig*100) ; gibt die Position des Balkens vor
    $percent = Round($isoaktuell/$isofertig*100)
    GUICtrlCreateLabel("File exists: " & $fs & "", 450, 80)
    GuiCtrlSetBkColor(-1, $elc)
    GUICtrlCreateLabel("Progress: " & $percent & " %", 135, 105)
    GUICtrlCreateLabel("Output: " & $percent & " kb", 289, 130)
    GUICtrlCreateLabel("Free Space on " & $savdrv & "\ = " & $fspace & " MB", 450 , 105)
    GuiCtrlSetBkColor(-1, 0x00CCCC)
    GUICtrlCreateLabel(" cmd.exe PID = " & $PID & "", 450, 130) ; ID = 16
    GuiCtrlSetBkColor(-1, 0xFF9966)
    GUICtrlCreateLabel("Step Nr. = " & $i & "" , 400, 15) ; ID = 16
    Sleep($wait) ; wartet vorgegebene Zeit
    ; $i = $percent
    EndIf ; Ende der Bedingung
    Next ; Weiter geht´s
    #cs
    If $i > 45 And $PID < 1 Then
    GUICtrlSetData($button, "DONE"); ändert label des button in DONE
    GuiCtrlSetBkColor(4, 0xFFFF00)
    GUICtrlCreateLabel("Process finished.", 135, 130)
    GuiCtrlSetBkColor(-1, 0x66FF33)
    #ce
    If $i > 100 Then
    GUICtrlSetData($button, "DONE"); ändert label des button in DONE
    GuiCtrlSetBkColor(4, 0xFFFF00)
    GUICtrlCreateLabel("Process finished.", 135, 130)
    GuiCtrlSetBkColor(-1, 0x66FF33)
    EndIf ; Ende der Bedingung
    ElseIf $msg = $button And GUICtrlRead($Button) = "CANCEL" Then
    $msg = $GUI_EVENT_CLOSE
    ElseIf $msg = $button And GUICtrlRead($Button) = "DONE" Then
    ProcessClose($exe) ; beendet CMD
    $msg = $GUI_EVENT_CLOSE
    EndIf ; Ende der Bedingung
    Until $msg = $GUI_EVENT_CLOSE ; bis Fenster geschlossen wird
    EndFunc ;==>Example
    ;__________________________________________________________________________________________

    [/autoit]


    Um mein Problem für Euch nachvollziehbar zu machen hab ich im "DEMO-Script" den eigentlichen Befehl durch ein blankes CMD-Fenster ersetzt.
    - Wenn das Script gestartet wird bewegt sich der Fortschrittsbalken. :P
    - Berechnet wird der Progress duch das Verhältnis von Source-Ordner zu fertiger Dateigröße. Wird im DEMO-Script natürlich nur simuliert.
    Jetzt kommt im ECHTEN Script der Haken:
    - mkisofs "spart" bis zu 15% Dateigröße durch Optimierung ein.
    Dadurch bleibt der Progress, nach beenden von mkisofs, schon bei 85% stehen während das Script weiterarbeiten will.
    Es lässt sich dann nicht mehr mit den GUI-Controls beenden, was denn wie ein Absturz des Programms wirkt. :thumbdown:
    - Ich wollte dann eine Formel einbauen, die im Falle von $PID = 0 dem Script suggeriert hätte daß $percent = 100 und somit das Ziel erreicht sei.
    Da bin ich nicht mehr weitergekommen. ?( Nach ZIGGG Versuchen muß ich Euch um Hilfe in der Angelegenheit bitten.

    Bitte zeigt mir mit welchen Code-Zeilen ich die Möglichkeit hab, nach Beendigung von "mkisofs.exe" die Schleife zu beenden und den Prozentwert auf 100 zu setzen.
    - Natürlich ist auch jede andere Problemlösung willkommen !

    Gruß M.

    PS. Wenn man wärend Ablauf des Scripts das CMD-Fenster schließt springt $PID zwar auf Null, aber im Hintergrund bleibt die letzte Ziffer der CMD.EXE-PID sichtbar.
    - Wie kann man das korrigieren ?

    3 Mal editiert, zuletzt von Macrostop (30. März 2009 um 23:13)

  • Hallo AutoBert

    Vielen herzlichen Dank für Dein Script. :thumbup:

    Ich habs so verstanden:
    Die gesamte Prozentwertbestimmung wird in eine eigene Funktion ausgelagert ?
    Da läuft ein Countdown bis der Progress fertig ist, und dann wird das Script beendet.
    Das funktioniert gut.

    "die Labels sollten eigentlich mit GuiCtrlSetState geändert werden"
    - Kannst Du dafür bitte noch ein Beispiel posten.

    Gruß M.

  • Hallo MacroStop,

    muß natürlich GUICtrlSetData (und nicht State) heisen, damit arbeitest du ja schon beim $button (START/CANCEL).

    Sorry muß wohl an der Uhrzeit gelegen haben

    mfg

    (Auto)Bert

  • Hallo MacroStop,

    die Prozentbestimmung hab ich ausgelagert, damit die eigentliche Do While schleife übersichtlicher wird, die DEMO Funktion musst du dir narürlich an deine Bedürfnisse/Gegebenheiten anpassen ($toDo = $percent-100 anstelle $toDo = $toDo -1 sollte reichen) .

    Die Labels erhalten Ihre neue Bschriftung natürlich mit GUICtrlSetData (und nicht State), damit arbeitest du ja schon beim $button (START/CANCEL). Sorry, muß wohl an der Uhrzeit gelegen haben

    mfg

    (Auto)Bert

  • Hi AutoBert

    Vielen Dank für Deinen Hinweis.
    Das DEMO-Script rattert zwar durch, aber in echt läuft das Script nicht.
    Wahrscheinlich weil $percent mit Null beginnen muß.
    Zur Kontrolle poste ich den Script mal als UNVOLLSTÄNDIG.

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=MKISOFS.ico
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; AutoIt Version: 3.3
    ; Template Version: 90129

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

    Opt("WinWaitDelay", 500)
    Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon
    Opt("MouseCoordMode", 0) ;1=absolute, 0=relative, 2=client
    Opt("ExpandEnvStrings", 1) ;0=don't expand, 1=do expand
    Opt("ExpandVarStrings", 1) ;0=don't expand, 1=do expand
    Opt("WinDetectHiddenText", 0) ;0=don't detect, 1=do detect
    Opt("WinTitleMatchMode", 1) ;1=start, 2=subStr, 3=exact, 4=advanced
    Opt("WinTextMatchMode", 1) ;1=complete, 2=quick

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

    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <Process.au3>
    #include <File.au3>
    Opt('MustDeclareVars', 1)
    Local $test, $size, $result, $fin, $log, $outfile, $savdrv, $outfile, $batch
    Local $outfile, $isofertig, $isoaktuell, $command, $exe, $delete, $indir, $fsinmb, $space, $savdrv, $fspace, $PID ;
    ;$indir = "S:\SYSTEM\CUSTOM-WPI"
    ;$outfile = "D:\GRUB.iso"
    ;$command = "mkisofs.exe -o " & $outfile & " " & $indir & ""
    $exe = "MKISOFS.exe"

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

    ;FileDelete($outfile)
    ;$delete = FileExists($outfile)
    ;$outfile = "" & $file & ""
    ; MsgBox(0 , "Info", " $outfile = " & $outfile & "")
    $delete = FileExists($outfile)
    ; MsgBox(48 , "Info", " FileExists = " & $outfile & "")
    FileDelete($outfile)
    $delete = FileExists($outfile)

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

    $exe = "mkisofs.exe"
    $indir = "C:\Temp"
    $outfile = "C:\TEST.ISO"
    $savdrv = "C:"
    $batch = "D:\OWNERFILES\AKTUELL\AUTOIT\MKISO_GUI\MKISOFS\exec.bat"
    $isofertig = DirGetSize($indir) ;kb
    $fsinmb = Round ($isofertig / 1024 / 1024, 2)
    $space = DriveSpaceFree( $savdrv )
    ; MsgBox(0 , "Info", " $space = " & $space & "")
    $fspace = Round ($space, 2)
    ; MsgBox(0 , "Info", " $fspace = " & $fspace & "")
    ; MsgBox(0 , "Info", "Estimated Filesize = " & $isofertig & " kb")
    ; MsgBox(0 , "Info", "Estimated Filesize = " & $fsinmb & " MB")
    $isoaktuell = 0

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

    Global $outfile, $isofertig, $isoaktuell, $command, $exe, $delete, $indir, $fsinmb, $space, $savdrv, $fspace, $PID, $i;
    Global $progressbar1, $button, $wait, $s, $msg, $m, $percent, $outsizeupd, $fs, $wtwf, $PID, $elc, $ToDo, $outfile, $batch

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

    Example()
    ;__________________________________________________________________________________________
    Func Example()
    ; Local $outfile, $isofertig, $isoaktuell, $command, $exe, $delete, $indir, $fsinmb, $space, $savdrv, $fspace, $PID ;
    ; MsgBox(0 , "Info", " $savdrv = " & $savdrv & "")
    $PID = ProcessExists($exe)
    $delete = FileExists($outfile)
    If $delete = 1 Then ; file exists
    $fs = "YES"
    Else
    $fs = "NO"
    EndIf
    ; GUICreate("MKISOFS - PreMastering - 90327", 660, 160, 50, 500) ; erstellt GUI-Fenster so groß wie DOS-Box
    GUICreate("MKISOFS - PreMastering - 90327", 660, 160, 50, 500) ; erstellt GUI-Fenster so groß wie DOS-Box
    $progressbar1 = GUICtrlCreateProgress(10, 45, 640, 20); Fortschrittsbalken
    $button = GUICtrlCreateButton("START", 20, 110, 80, 30) ; erstellt START-Button ; ID = 4
    GuiCtrlSetBkColor(-1, 0xFFFF00)
    GUICtrlCreateLabel("Source: " & $indir & "", 20, 15) ; ID = 5
    GUICtrlCreateLabel("File: " & $outfile & "", 20, 80) ; ID = 6
    GUICtrlCreateLabel("File exists: " & $fs & "", 450, 80) ; ID = 7
    GUICtrlCreateLabel("Size: " & $fsinmb & " MB", 300, 105) ; ID = 8
    GUICtrlCreateLabel("Output: 0 MB", 288, 130) ; ID = 9
    GUICtrlCreateLabel("Progress: 0 %", 135, 105) ; ID = 13
    GUICtrlCreateLabel("Free Space on " & $savdrv & "\ = " & $fspace & " MB", 450 , 105) ; ID = 80
    GuiCtrlSetBkColor(-1, 0x00CCCC)
    GUISetState(@SW_SHOW) ; startet die GUI
    $wait = 10000 ; time in msec to next loop-step
    $percent = 0
    GUICtrlSetData($progressbar1, $percent) ; gibt die Position des Balkens vor
    $ToDo = 101 ; noch nicht angefangen
    Do ; Anfang der Schleife (= Anfang der progresssteps ?)
    $msg = GUIGetMsg() ; fragt ob, und was geklickt wurde
    If $msg = $button And GUICtrlRead($Button) = "START" Then ; wenn button-click START
    Run(@ComSpec & " /c " & $batch & "", $indir)
    WinWait("C:\WINDOWS\system32\cmd.exe")
    WinMove("C:\WINDOWS\system32\cmd.exe", "", 50, 100)
    GUICtrlSetData($button, "CANCEL"); ändert label des button in CANCEL
    GuiCtrlSetBkColor(4, 0xFF6600)
    $msg = 0
    $ToDo = 100 ;angefangen
    EndIf
    If $msg = $button And GUICtrlRead($Button) = "CANCEL" Then $ToDo = -1; abbrechen
    if $msg = $GUI_EVENT_CLOSE Then $ToDo = -1; auch abbrechen
    ;ConsoleWrite("DO-Schleife: "&$ToDo & @CRLF)
    If $ToDo <101 and $ToDo >0 Then ; wenn angefangen und nicht abgebrochen wurde ----------?---------
    if Not ProcessExists($exe) Then $ToDo =-1 ; auch abbrechen Prozess existiert nicht (mehr?)
    if $ToDo >0 Then _writePercentDEMO() ; startet Func _writePercentDEMO()
    EndIf
    Until $ToDo <= 0; bis fertig
    If ProcessExists($exe) Then ProcessClose($exe) ; beende CMD
    Sleep(2000)
    EndFunc ;==>Example

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

    Func _writePercentDEMO()
    $ToDo = $percent-100 ; startet mit 99 ? ----------?---------
    ;ConsoleWrite("FUNC: "&$ToDo & @CRLF)
    $i = 100 - $ToDo ; startet mit 99 ? ----------?---------
    $space = DriveSpaceFree( $savdrv ) ; prüft freien speicherplatz
    $fspace = Round ($space, 2) ; rundet die zahl auf 2 stellen hinterm komma
    $isoaktuell = FileGetSize($outfile); prüft Dateigröße in kb
    $outsizeupd = Round ($isoaktuell / 1024 / 1024, 2); prüft Dateigröße in MB
    $percent = Round($isoaktuell/$isofertig*100) ; errechnet prozentwert
    GUICtrlSetData($progressbar1, $percent) ; gibt die Position des Balkens vor

    ;die Labels sollten eigentlich mit GuiCtrlSetState geändert werden und nicht jedesmal neu erzeugt ----------?---------
    GuiCtrlCreateLabel("File exists: " & $fs & "", 450, 80)
    ; GuiCtrlSetBkColor(-1, $elc)
    GUICtrlCreateLabel("Progress: " & $percent & " %", 135, 105)
    GUICtrlCreateLabel("Output: " & $percent & " kb", 289, 130)
    GUICtrlCreateLabel("Free Space on " & $savdrv & "\ = " & $fspace & " MB", 450 , 105)
    GuiCtrlSetBkColor(-1, 0x00CCCC)
    GUICtrlCreateLabel(" cmd.exe PID = " & $PID & "", 450, 130) ; ID = 16
    GuiCtrlSetBkColor(-1, 0xFF9966)
    GUICtrlCreateLabel("Step Nr. = " & $i & "" , 400, 15) ; ID = 16
    Sleep($wait) ; wartet vorgegebene Zeit
    EndFunc

    [/autoit]


    Was mich aber viel weiter gebracht hat war Dein Tip mit dem "GUICtrlSetData". :P

    Zur Lösung der Exit-Strategiie mußte ich 3 Zeilen einfügen:

    [autoit]

    $PID = ProcessExists($exe)
    If $PID < 1 Then $i = 100
    ...
    If $i > 100 Or $PID = 0 Then

    [/autoit]


    Ende gut alles gut . . .

    Besten Dank und Gruß - M.

    Einmal editiert, zuletzt von Macrostop (30. März 2009 um 23:20)

  • Hallo MacroStop,

    ich seh zwar du hast eine Lösung gefunden, aber da ich nochmal etwas weitergemacht habe ist hier mein Stand:

    autoit.de/wcf/attachment/4245/

    Den Tip den ich dir gegeben habe für $ToDo mußte genau anders herum lauten, ist in diesem Stand berücksichtigt.
    Schau einfach mal hinein, vielleicht kannst du es ja gebrauchen.

    Edit hab gesehen, dass du wissen möchtest wie man Steuerelemente versteckt, hab ich an Hand von $Button (START/CANCEL) eingefügt.

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (31. März 2009 um 05:47)

  • Hi AutoBert

    Vielen Dank für Deine Bemühungen, Du hast Dich ja echt reingehängt. :thumbup:
    Ich hab Dein Update gerade übertragen aber dennoch wird nur CMD-Befehl mitsamt Deiner neuen Schlußmeldung ausgeführt.
    Der Fortschrittsbalken zeigt sich nicht und auch die Prozente bleiben auf Null.
    Damit Du es selbst testen kannst hab ich hier das Script:
    autoit.de/wcf/attachment/4249/
    und hier die dazugehörige Batch-Datei "exec.bat",

    Code
    @Echo off
    Title MKISOFS - creating image . . .
    color 1E
    MKISOFS.exe -volid TEST-090401 -iso-level 4 -duplicates-once   -o "C:\TEST.iso" "C:\TEMP"


    - die zusammen mit mkisofs.exe MD5=(cc9d20cc7aca844a99f8e11e94a94d60) und dem Script in einem Ordner gespeichert sein müssen.
    Hab grad bemerkt daß die Version in den neuesten cdrtools "-duplicates-once" nicht (mehr) unterstützt, deshalb obige Version verwenden.
    Dann erstell einen Ordner C:\Temp in dem Du wiederum einen Ordner zb "C:\TEMP\SUB" mit ca.100mb Dateien Deiner Wahl erstellst.
    Mach einen ersten Test mit dem Script: ISO ist so groß wie der Ordner C:\TEMP.
    Mach dann eine Kopie von "C:\TEMP\SUB" => "C:\TEMP\Kopie von SUB", und wieder ein neues ISO.
    ISO ist nur halb so groß wie der Ordner C:\TEMP. ;)

    Danke für Deinen Hinweis auf $GUI_HIDE.
    Interressant ist auch der ExitCode: "Exit($ToDo*-1)".

    -Kann man das

    [autoit]

    $delete = FileExists($outfile)
    If $delete = 1 Then ; file exists
    $fs = "YES"
    Else
    $fs = "NO"
    EndIf

    [/autoit]


    in eine eigene Funktion auslagern ?

    Gruß M.

    2 Mal editiert, zuletzt von Macrostop (31. März 2009 um 11:58)

  • Hallo MacroStop,

    nach deinem letzten Post bin ich der Überzeugung, das deine Programmidee so nicht zu verwirklichen ist. Wenn die Platzersparnis so stark differiert (15% und 50%) kannst du dir ja nie sicher sein, ob wirklich alles abgearbeitet wurde.

    Google mal nach CT Offline Update und lade es dir herunter ist ein nützliches Tool einerseits und andererseits arbeitet da ein Vollprofi mit AutoIT, VBS und CMD-Programmierung und MKSiofs.

    Ich hoffe du findest in den Skripten Anregungen für einen möglichen Lösungsweg.


    mfg (Auto)Bert