Problem mit nem Script

  • Hi zusammen.

    Hab en kleines Problemchen mit nem script.
    is nochnet ganz fertig, aber egal.

    Hier mal der Code:

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    GUICreate ("Zeitanzeige", 345, 118)
    GUISetState (@SW_SHOW)
    Opt("GUICloseOnESC", 1)
    GUISetBkColor (0xb8bcc5)

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

    $go1 = GUICtrlCreateButton ("Start", 240, 30, 40, 22)
    $go2 = GUICtrlCreateButton ("Nur die Uhrzeit anzeigen", 1, 74, 343)
    $exit = GUICtrlCreateButton ("Exit", 1, 100, 343, 17)
    $wann = GUICtrlCreateLabel ("Um wieviel Uhr soll der PC herruntergefahren werden?", 10, 10, 310)
    GUICtrlSetFont ($wann, 10)
    $inputH = GUICtrlCreateInput ("Std", 10, 30, 25, 20, $ES_NUMBER)
    GUICtrlSetLimit (-1, 2, 2)
    $inputM = GUICtrlCreateInput ("Min", 50, 30, 25, 20, $ES_NUMBER)
    GUICtrlSetLimit (-1, 2, 2)
    $inputS = GUICtrlCreateInput ("Sek", 90, 30, 25, 20, $ES_NUMBER)
    GUICtrlSetLimit (-1, 2, 2)
    $HN = GUICtrlCreateCombo("", 130, 30, 100)
    GUICtrlSetData(-1, "Herunterfahren|Neustarten|Abmelden", "Herunterfahren")
    $bs = GUICtrlCreateLabel (" HH | MM | SS", 9, 54, 100)

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

    While 1
    $msg = GUIGetMsg ()
    Select
    Case $msg = $go2
    GUICtrlDelete ($go1)
    GUICtrlDelete ($go2)
    GUICtrlDelete ($bs)
    GUICtrlDelete ($HN)
    GUICtrlDelete ($wann)
    GUICtrlDelete ($inputH)
    GUICtrlDelete ($inputM)
    GUICtrlDelete ($inputS)
    While 1
    $timeH = @HOUR
    $timeM = @MIN
    $timeS = @SEC
    $TimeHMS = GUICtrlCreateLabel ($timeH & ":" & $timeM & ":" & $timeS, 10, 10, 400, 90)
    GUICtrlSetFont ($TimeHMS, 60)
    Sleep (1000)
    WEnd
    Case $msg = $go1
    If GuiCtrlRead($inputH) > -1 and GuiCtrlRead($inputH) < 25 and GuiCtrlRead($inputM) > -1 and GuiCtrlRead($inputM) < 60 and GuiCtrlRead($inputS) > -1 and GuiCtrlRead($inputS) < 60 then
    $X = GUICtrlRead ($HN, 1)
    $H = GuiCtrlRead ($inputH, 1)
    $M = GuiCtrlRead ($inputM, 1)
    $S = GuiCtrlRead ($inputS, 1)
    MsgBox (64, $X, "Der PC wird sich um " & $H & ":" & $M & ":" & $S & " " & $X)
    GUICtrlDelete ($go1)
    GUICtrlDelete ($go2)
    GUICtrlDelete ($bs)
    GUICtrlDelete ($HN)
    GUICtrlDelete ($wann)
    GUICtrlDelete ($inputH)
    GUICtrlDelete ($inputM)
    GUICtrlDelete ($inputS)
    While 1
    $timeH = @HOUR
    $timeM = @MIN
    $timeS = @SEC
    $TimeHMS = GUICtrlCreateLabel ($timeH & ":" & $timeM & ":" & $timeS, 10, 10, 400, 90)
    GUICtrlSetFont ($TimeHMS, 60)
    Sleep (1000)
    If $TimeH = $H And $TimeM = $M And $TimeS = $S Then
    If $X = "Herunterfahren" Then
    MsgBox (64, "Herunterfahren", "Der Pc wird sich nun herunterfahren!")
    ElseIf $X = "Neustarten" Then
    MsgBox (64, "Neustarten", "Der PC wird sich nun neustarten!")
    ElseIf $X = "Abmelden" Then
    MsgBox (64, "Abmelden", "Der PC wird sich nun Abmelden!")
    EndIf
    EndIf
    WEnd
    Else
    MsgBox (16, "Error", "Bitte nur gültige Zeiten eingeben!")
    EndIf
    Case $msg = $exit
    Exit
    EndSelect
    WEnd

    [/autoit]

    Also, das problem ist, er will nicht beenden, wenn die Uhr gestartet ist.
    Wie ändere ich das?

    MfG

  • Vorschlag:
    Nicht den PC ohne Vorwarnung herunter fahren. Eine MsgBox z. B. 10 Minuten zuvor mit dem Text "Die maximale Nutzungsdauer am PC ist in 10 Minuten erreicht. Der PC wird dann herunter gefahren." wäre freundlicher für den Anwender.

    Bsp.:

    Spoiler anzeigen
    [autoit]


    MsgBox(0,"Warnmeldung","Die maximale Nutzungsdauer am PC ist in 10 Minuten erreicht. Der PC wird dann herunter gefahren.")

    [/autoit]

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Mhh, ja gut, das kann man ja noch ändern/einfügen.

    Aber das ist ja nicht das eigentliche Problem...

    • Offizieller Beitrag

    Da sind gleich mehrere Fehler im Script:

    1. Du erstellst immer wieder (jede Sekunde) ein Label: $TimeHMS = GUICtrlCreateLabel ($timeH & ":" & $timeM & ":" & $timeS, 10, 10, 400, 90)
    Das führt dazu, dass AutoIt irgendwann (nach ein paar tausend erstellten Label) sehr langsam wird und irgendwann sogar abstürzt (max. Anzahl an Controls erreicht)
    Abhilfe: Label nur am Anfang erstellen und später dann die Daten mit GUICtrlSetData dort eintragen.

    2. Sleep(1000) im Zusammenhang mit: If $TimeH = $H And $TimeM = $M And $TimeS = $S Then... ist eine sehr wackelige Konstruktion, da bereits eine Millisekunde darüber entscheiden kann, ob Dein Script korrekt funktioniert oder nicht.
    Abhilfe: Sleep-Wert reduzieren auf z.B. 500 oder die Abfrage ändern in: ...And $TimeS >= $S

    3. Wäre das benutzen eines Timers flexibler. Man könnte dann auch anbieten: in XX Sek/Min/Std runterfahren etc.

  • wow Oscar, du wirfst hier ganz schön mit Fachchinesich um dich :rofl:

    Bin leider noch nich so weit, um einfach mal so, so große änderungen durch zu nehmen ^^
    Ok, ich fang mal an.

    1. Das Label:
    Würde es vllt so gehn, dass ich nach beenden der Runde durch die While schleife ein GUICtrlDelete mache, das das Label löscht um es dann wieder neu zu erstellen.
    Damit würde immer nur ein Label da sein.

    2. Sleep:
    Also eigl. hab ich damit keine Probleme. Egal wie oft ich es Probiere, es klappt eigl. immer...

    3. Timer:
    Was genau meinst du mit "Timer"? Kenne das bis jetz noch nicht glaub ich.

    • Offizieller Beitrag

    Na gut, ich habe Dein Script mal etwas geändert, um Dir zu zeigen, wie man das eigentlich macht:

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <DateTimeConstants.au3>
    #include <GUIConstantsEx.au3>
    Opt("GUICloseOnESC", 1)

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

    GUICreate("Zeitanzeige", 345, 138)
    GUISetBkColor(0xb8bcc5)
    $go1 = GUICtrlCreateButton("Start", 240, 30, 40, 22)
    $exit = GUICtrlCreateButton("Exit", 1, 100, 343, 17)
    $wann = GUICtrlCreateLabel("Um wieviel Uhr soll der PC herruntergefahren werden?", 10, 10, 310)
    GUICtrlSetFont(-1, 10)
    $hTime = GUICtrlCreateDate("", 10, 30, 70, 20, $DTS_TIMEFORMAT)
    $TimeHMS = GUICtrlCreateLabel("", 10, 10, 400, 90)
    GUICtrlSetFont(-1, 60)
    GUICtrlSetState(-1, $GUI_HIDE)
    $HN = GUICtrlCreateCombo("", 130, 30, 100)
    GUICtrlSetData(-1, "Herunterfahren|Neustarten|Abmelden", "Herunterfahren")
    $bs = GUICtrlCreateLabel(" HH:MM:SS", 9, 54, 100, 20)
    $Status = GUICtrlCreateLabel("", 0, 118, 345, 20, Default, $WS_EX_CLIENTEDGE)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetBkColor(-1, 0xeeeeee)
    GUISetState(@SW_SHOW)

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

    $go = False
    $oldTime = @HOUR & ':' & @MIN & ':' & @SEC
    While 1
    $sTime = @HOUR & ':' & @MIN & ':' & @SEC
    If $sTime <> $oldTime Then
    $oldTime = $sTime
    GUICtrlSetData($TimeHMS, $sTime)
    EndIf
    If $go = True And GUICtrlRead($hTime) = $sTime Then
    Switch GUICtrlRead($HN)
    Case "Herunterfahren"
    MsgBox(64, "Herunterfahren", "Der Pc wird sich nun herunterfahren!")
    Case "Neustarten"
    MsgBox(64, "Neustarten", "Der PC wird sich nun neustarten!")
    Case "Abmelden"
    MsgBox(64, "Abmelden", "Der PC wird sich nun Abmelden!")
    EndSwitch
    EndIf
    Switch GUIGetMsg()
    Case $go1
    GUICtrlSetState($go1, $GUI_HIDE)
    GUICtrlSetState($bs, $GUI_HIDE)
    GUICtrlSetState($HN, $GUI_HIDE)
    GUICtrlSetState($wann, $GUI_HIDE)
    GUICtrlSetState($hTime, $GUI_HIDE)
    GUICtrlSetState($TimeHMS, $GUI_SHOW)
    GUICtrlSetData($Status, GUICtrlRead($HN) & " um: " & GUICtrlRead($hTime))
    $go = True
    Case $exit, $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]