Hallo Liebe AutoIt.de-Community
Ich hab ein Skript, dass mir Software im Hintergrund installiert (einfacher "Run" Befehl). Per GUI soll mir der Fortschritt mitgeteilt werden. Zurzeit mache ich das über eine Sleep Funktion, sodass beispielsweise jede Sekunde die Prozentzahl steigt.
Zum eigentlichen Problem:
Ich habe das Problem gehabt, dass mein Skript pausiert wird, wenn ich das Fenster verschiebe während das Fortschrittslabel aktualisiert wird.
Somit habe ich mich erkundigt und arbeite jetzt mit Edits und Timer. Das Problem ist, dass sich das Skript häufig aufhängt und nicht mehr reagiert.
Hier mein Skript (Ich hoffe ich hab es ausreichend kommentiert):
Spoiler anzeigen
#include <Array.au3>
#include <ButtonConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>
;Form
$frmInstall = GUICreate("Softwareinstallation", 354, 150, -1, -1, $WS_CLIPSIBLINGS)
;Titel
$lblTitle = GUICtrlCreateLabel("Software wird installiert...", 27, 16, 175, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
;Button "Fenster verstecken"
$btnHide = GUICtrlCreateButton("Fenster verstecken", 219, 12, 107, 25)
;TrayItem erstellen
$showItem = TrayCreateItem("hide window")
Global $lblSW_title[1], $edtSW_progress[1]
[/autoit] [autoit][/autoit] [autoit];Labels für Softwaretitel erstellen
_ArrayAdd($lblSW_title, GUICtrlCreateLabel("Software1", 84, 56, 168, 17, $SS_LEFTNOWORDWRAP))
_ArrayAdd($lblSW_title, GUICtrlCreateLabel("Software2", 84, 70, 168, 17, $SS_LEFTNOWORDWRAP))
;Edits für Fortschrittsanzeige erstellen
_ArrayAdd($edtSW_progress, GUICtrlCreateEdit("warte...", 264, 56, 41, 17, BitOR($ES_CENTER,$ES_READONLY,$ES_WANTRETURN), 0))
_ArrayAdd($edtSW_progress, GUICtrlCreateEdit("warte...", 264, 70, 41, 17, BitOR($ES_CENTER,$ES_READONLY,$ES_WANTRETURN), 0))
;GUI und Tray Checks aktivieren
AdlibRegister("_GUIcheck", 20)
AdlibRegister("_TrayCheck", 20)
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]For $SWcount = 1 To 2 ;Für jede Software bis (hier 2)
$avgtime = 30 ;# Sleep
$ZE = $avgtime * 1000 ;# Berechnen
$sleep = $ZE / 99 ;#
$PID = Run("ein_setup.exe") ;Setup ausführen
[/autoit] [autoit][/autoit] [autoit]$i = 1
_Timer_SetTimer($frmInstall, $sleep * 2, "_updateProgress") ;für Fortschritts-Update-Funktion
While $i <= 99 And ProcessExists($PID)
Sleep($sleep)
WEnd
$i = 100
GUICtrlSetData($edtSW_progress[$SWcount], "100%") ;Fortschritt auf 100% setzen
[/autoit] [autoit][/autoit] [autoit]TrayTip("Installation abgeschlossen", GUICtrlRead($lblSW_title[$SWcount]) & " wurde installiert.", 5)
Next
_Timer_KillAllTimers($frmInstall)
Sleep(5000)
Exit
Func _updateProgress($hWnd, $Msg, $iIDTimer, $dwTime)
#forceref $hWnd, $Msg, $iIDTimer, $dwTime
If $i <= 99 AND ProcessExists($PID) Then
GUICtrlSetData($edtSW_progress[$SWcount], $i & "%")
Sleep($sleep)
$i += 1
Return
EndIf
_Timer_KillAllTimers($frmInstall)
EndFunc
Func _GUIcheck()
Local $nMsg = GUIGetMsg()
Switch $nMsg
Case $btnHide
TrayItemSetText($showItem, "show")
GUISetState(@SW_HIDE)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
EndFunc ;==>_GUIcheck
Func _TrayCheck()
Local $nMsg = TrayGetMsg()
Switch $nMsg
Case $showItem
Local $WinState = WinGetState($frmInstall)
If $WinState = 7 Then
GUISetState(@SW_HIDE)
TrayItemSetText($showItem, "show window")
ElseIf $WinState = 5 Then
GUISetState(@SW_SHOW)
TrayItemSetText($showItem, "hide window")
EndIf
EndSwitch
EndFunc ;==>_TrayCheck
Ich hoffe ihr habt für mich eine Lösung
MfG WATERSTORMms