Countdown schluckt mächtig Leistung

  • Hallo zusammen ,

    vor ca. 2 Monaten bin ich auf AutoIt gestoßen und bin ziemlich zufriden. BIs dahin hab ich so zimlich alle Scripte für den täglichen Bedarf als Batch geschreiben, allerdings war mir das mit der Zeit doch etwas zu unkomfortabel ;)

    Wie dem auch sei - Bis jetzt bin ich ganz gut zu Recht gekommen mit Doku / Hilfe lesen und Google löchern. Allerdings stehe ich jetzt vor einem Problem, dass ich auf die Art und Weise noch nichht lösen konnte - Oder besser gesagt, ich weiß nicht, wie ich mein Problem forumlieren soll.

    Ziel meines Script soll es sein für eine Freundin die Baby-Jahr-Vertretungs-Tage rückwärts zu zählen. Mein Script funktioniert bis jetzt auch ganz gut, und macht, soweit ich das bis jetzt getestet hab, genau das. was es soll. Einen Haken gibts jedoch: Das ganze schluckt mächtig Leistung., Auf meinem guten alten Notebook mit nem Pentium 4m mit 2,4 GHz ist die CPU-Last durchgehend auf 50% und der Lüfter läuft im Dauerbetrieb... Das würde ich ganz gerne Ändern, ohne an der eigentlichen Ausgabe des Scripts was zu ändern.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <Date.au3>
    #include <EditConstants.au3>
    #include <GuiStatusBar.au3>
    #Include <Clipboard.au3>
    #include <ProgressConstants.au3>

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

    #NoTrayIcon

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

    GUICreate("Heike's Mini-Wienrode-O-Meter", 341, 172, -1, -1)

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

    GUICtrlCreateLabel("Noch", 8, 12, 28, 17)
    $Input1 = GUICtrlCreateInput("", 8, 33, 324, 21, $ES_READONLY)
    $Input2 = GUICtrlCreateInput("", 8, 60, 324, 21, $ES_READONLY)
    $Progress1 = GUICtrlCreateProgress(8, 87, 324, 21, $PBS_SMOOTH)
    $ButtonBeenden = GUICtrlCreateButton("Beenden", 263, 123, 75, 25, 0)

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

    ;Menu
    $MenuDatei = GUICtrlCreateMenu("Datei")
    $MenuClipboard = GUICtrlCreateMenuItem("Restzeit in die Zwischenablage kopieren", $MenuDatei)
    $MenuBeenden = GUICtrlCreateMenuItem("Beenden", $MenuDatei)
    $MenuFrageZeichen = GUICtrlCreateMenu("?")
    $MenuInfo = GUICtrlCreateMenuItem("Info", $MenuFrageZeichen)

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

    GUICtrlCreateGroup("", 328, 104, 1, 9)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup("", 2, 0, 337, 117)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)

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

    ;EndeTag Wienrode (Ende von Fr. Lutters Baby-Jahr)
    $WienrodeEnde="2010/02/26 00:00:00"

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

    ;AnfangsTag Wienrode
    $WienrodeAnfang="2009/01/01 00:00:00"

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

    ;Gesamtzeit in Tagen
    $GesamtTage=abs(_DateDiff('D', $WienrodeAnfang, $WienrodeEnde))
    ;Gesamtzeit in Sekunden (Grundlage für genauere %-Rechnung & Progress-Bar)
    $GesamtSek=abs(_DateDiff('s', $WienrodeAnfang, $WienrodeEnde))

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

    While 1

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

    $nMsg = GUIGetMsg()

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

    if _NowCalc() > $WienrodeEnde Then ;Da der Timer sonst ab dem 26.02.2010 ziemlich am Sender dreht...

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

    $GeschafftTage=$GesamtTage

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

    $calcMonate='0'
    $calcTage='0'
    $calcStunden='0'
    $calcMinuten='0'
    $calcSekunden='0'

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

    $Message = $calcMonate& ' Monate, ' & $calcTage & ' Tage, '& $calcStunden & ' Stunden, ' & $calcMinuten & ' Minuten und ' & $calcSekunden & ' Sekunden.'
    GUICtrlSetData($Input1, $Message)

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

    $ProgressState=100
    GUICtrlSetData($Progress1, ($ProgressState))

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

    $Message2 = 'Du hast '&$GeschafftTage & ' von insgesamt ' & $GesamtTage & ' Tagen geschafft !!! ( ' & $ProgressState & ' % )'
    GUICtrlSetData($Input2, $Message2)

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

    ELSE

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

    ;Uebrige Tage
    ;$UebrigTage=abs(_DateDiff('D', _NowCalc(), $WienrodeEnde))

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

    ;Geschaffte Tage
    $GeschafftTage=abs(_DateDiff('D', $WienrodeAnfang, _NowCalc()))

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

    ;Geschaffte Sek (Grundlage für genauere %-Rechnung & Progress-Bar)
    $GeschafftSek=abs(_DateDiff('s', $WienrodeAnfang, _NowCalc()))

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

    ;Monate
    $calcMonate=abs(_DateDiff('M',_NowCalc(), $WienrodeEnde ))

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

    ;Monate auf aktuelles Datum draufrechnen
    $DatumPlusMonate=_Dateadd('M', $calcMonate, _NowCalc())

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

    ;Tage
    $calcTage=abs(_DateDiff('D', $DatumPlusMonate, $WienrodeEnde))

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

    ;Tage auf Datum+Monate aufrechnen
    $MonatePlusTage=_Dateadd('D', $calcTage, $DatumPlusMonate)

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

    ;Stunden
    $calcStunden=abs(_DateDiff('h', $MonatePlusTage, $WienrodeEnde))

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

    ;Stunden auf Datum+Monate+Tage aufrechnen
    $TagePlusStunden=_Dateadd('h', $calcStunden, $MonatePlusTage)

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

    ;Minuten
    $calcMinuten=abs(_DateDiff('n', $TagePlusStunden, $WienrodeEnde))

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

    ;Minuten auf Datum+Monate+Tage+Stunden aufrechnen
    $StundenPlusMinuten=_Dateadd('n', $calcMinuten, $TagePlusStunden)

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

    ;Sekunden
    $calcSekunden=abs(_DateDiff('s', $StundenPlusMinuten, $WienrodeEnde))

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

    ;Restzeit-Message erstellen und an die 1. Input-Box übergeben
    $Message = $calcMonate& ' Monate, ' & $calcTage & ' Tage, '& $calcStunden & ' Stunden, ' & $calcMinuten & ' Minuten und ' & $calcSekunden & ' Sekunden.'
    GUICtrlSetData($Input1, $Message)

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

    ;Geschaffte % ausrechnen und an Progress-bar übergeben
    $ProgressState=((100*$GeschafftSek)/$GesamtSek)
    GUICtrlSetData($Progress1, ($ProgressState))

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

    ;RestTage-Message erstellen und an die 2. Input-Box übergeben
    $Message2 = 'Du hast '&$GeschafftTage & ' von insgesamt ' & $GesamtTage & ' Tagen geschafft !!! ( ' & ROUND($ProgressState, 1) & ' % )'
    GUICtrlSetData($Input2, $Message2)

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

    EndIf

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

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $MenuBeenden
    Exit

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

    Case $ButtonBeenden
    Exit

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

    Case $MenuClipboard
    $textClipBoard = 'Noch '& $calcMonate& ' Monate, ' & $calcTage & ' Tage, '& $calcStunden & ' Stunden, ' & $calcMinuten & ' Minuten und ' & $calcSekunden & ' Sekunden.' & @CRLF & 'Du hast '&$GeschafftTage & ' von insgesamt ' & $GesamtTage & ' Tagen geschafft!!! ( ' & ROUND($ProgressState, 1) & '% )'
    _ClipBoard_SetData($textClipBoard, $CF_TEXT)
    MsgBox(64, "Zwischenablage", "Die Restzeit wurde in die Zwischenablage kopiert und kann jetzt in ein (Text-) Programm eingefügt werden.", 5)

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

    Case $MenuInfo
    MsgBox(64, "Info", "Wienrode-O-Meter: Ausschließlich und nur für ************." & @CRLF & "__________________________________________________" & @CRLF & @CRLF & "© 2009 - ***********")

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

    EndSwitch
    WEnd

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

    Vermutlich rollen sich dem Ein oder Anderen jetzt die Fußnägel hoch und runter... :D Aber für konstruktive Kritik und Verbesserungsvorschläge wäre ich sehr dankbar.

    gruß Philipp

    2 Mal editiert, zuletzt von Phil1989 (16. April 2009 um 21:19)

  • oh man... genau das wars... sleep(50) und wir sind auf ~10% Last runter...

    Mein Gott... und ich hab schon gedacht, ich hab von Grund auf was an der Berechnung "falsch" gemacht...

    @ Bitboy: Danke!

  • wenn man guigetMsg in der Schleife hat, braucht man kein Sleep. Aber die Zeit musst du nur einmal pro Sekunde updaten ;) Das kannst du z.B. mit TimerInit/TimerDiff in einem If-Block erledigen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Date.au3>
    #include <EditConstants.au3>
    #include <GuiStatusBar.au3>
    #Include <Clipboard.au3>
    #include <ProgressConstants.au3>

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

    #NoTrayIcon

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

    GUICreate("Heike's Mini-Wienrode-O-Meter", 341, 172, -1, -1)

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

    GUICtrlCreateLabel("Noch", 8, 12, 28, 17)
    $Input1 = GUICtrlCreateInput("", 8, 33, 324, 21, $ES_READONLY)
    $Input2 = GUICtrlCreateInput("", 8, 60, 324, 21, $ES_READONLY)
    $Progress1 = GUICtrlCreateProgress(8, 87, 324, 21, $PBS_SMOOTH)
    $ButtonBeenden = GUICtrlCreateButton("Beenden", 263, 123, 75, 25, 0)

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

    ;Menu
    $MenuDatei = GUICtrlCreateMenu("Datei")
    $MenuClipboard = GUICtrlCreateMenuItem("Restzeit in die Zwischenablage kopieren", $MenuDatei)
    $MenuBeenden = GUICtrlCreateMenuItem("Beenden", $MenuDatei)
    $MenuFrageZeichen = GUICtrlCreateMenu("?")
    $MenuInfo = GUICtrlCreateMenuItem("Info", $MenuFrageZeichen)

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

    GUICtrlCreateGroup("", 328, 104, 1, 9)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup("", 2, 0, 337, 117)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)

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

    ;EndeTag Wienrode (Ende von Fr. Lutters Baby-Jahr)
    $WienrodeEnde="2010/02/26 00:00:00"

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

    ;AnfangsTag Wienrode
    $WienrodeAnfang="2009/01/01 00:00:00"

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

    ;Gesamtzeit in Tagen
    $GesamtTage=abs(_DateDiff('D', $WienrodeAnfang, $WienrodeEnde))
    ;Gesamtzeit in Sekunden (Grundlage für genauere %-Rechnung & Progress-Bar)
    $GesamtSek=abs(_DateDiff('s', $WienrodeAnfang, $WienrodeEnde))
    $timer = 1000; damit sofort geupdated wird
    While 1

    $nMsg = GUIGetMsg()
    If TimerDiff($timer)>990 Then
    if _NowCalc() > $WienrodeEnde Then ;Da der Timer sonst ab dem 26.02.2010 ziemlich am Sender dreht...

    $GeschafftTage=$GesamtTage

    $calcMonate='0'
    $calcTage='0'
    $calcStunden='0'
    $calcMinuten='0'
    $calcSekunden='0'

    $Message = $calcMonate& ' Monate, ' & $calcTage & ' Tage, '& $calcStunden & ' Stunden, ' & $calcMinuten & ' Minuten und ' & $calcSekunden & ' Sekunden.'
    GUICtrlSetData($Input1, $Message)

    $ProgressState=100
    GUICtrlSetData($Progress1, ($ProgressState))

    $Message2 = 'Du hast '&$GeschafftTage & ' von insgesamt ' & $GesamtTage & ' Tagen geschafft !!! ( ' & $ProgressState & ' % )'
    GUICtrlSetData($Input2, $Message2)


    ELSE

    ;Uebrige Tage
    ;$UebrigTage=abs(_DateDiff('D', _NowCalc(), $WienrodeEnde))

    ;Geschaffte Tage
    $GeschafftTage=abs(_DateDiff('D', $WienrodeAnfang, _NowCalc()))

    ;Geschaffte Sek (Grundlage für genauere %-Rechnung & Progress-Bar)
    $GeschafftSek=abs(_DateDiff('s', $WienrodeAnfang, _NowCalc()))

    ;Monate
    $calcMonate=abs(_DateDiff('M',_NowCalc(), $WienrodeEnde ))

    ;Monate auf aktuelles Datum draufrechnen
    $DatumPlusMonate=_Dateadd('M', $calcMonate, _NowCalc())

    ;Tage
    $calcTage=abs(_DateDiff('D', $DatumPlusMonate, $WienrodeEnde))

    ;Tage auf Datum+Monate aufrechnen
    $MonatePlusTage=_Dateadd('D', $calcTage, $DatumPlusMonate)

    ;Stunden
    $calcStunden=abs(_DateDiff('h', $MonatePlusTage, $WienrodeEnde))

    ;Stunden auf Datum+Monate+Tage aufrechnen
    $TagePlusStunden=_Dateadd('h', $calcStunden, $MonatePlusTage)

    ;Minuten
    $calcMinuten=abs(_DateDiff('n', $TagePlusStunden, $WienrodeEnde))

    ;Minuten auf Datum+Monate+Tage+Stunden aufrechnen
    $StundenPlusMinuten=_Dateadd('n', $calcMinuten, $TagePlusStunden)

    ;Sekunden
    $calcSekunden=abs(_DateDiff('s', $StundenPlusMinuten, $WienrodeEnde))

    ;Restzeit-Message erstellen und an die 1. Input-Box übergeben
    $Message = $calcMonate& ' Monate, ' & $calcTage & ' Tage, '& $calcStunden & ' Stunden, ' & $calcMinuten & ' Minuten und ' & $calcSekunden & ' Sekunden.'
    GUICtrlSetData($Input1, $Message)

    ;Geschaffte % ausrechnen und an Progress-bar übergeben
    $ProgressState=((100*$GeschafftSek)/$GesamtSek)
    GUICtrlSetData($Progress1, ($ProgressState))

    ;RestTage-Message erstellen und an die 2. Input-Box übergeben
    $Message2 = 'Du hast '&$GeschafftTage & ' von insgesamt ' & $GesamtTage & ' Tagen geschafft !!! ( ' & ROUND($ProgressState, 1) & ' % )'
    GUICtrlSetData($Input2, $Message2)

    EndIf
    $timer = TimerInit()
    EndIf
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    Case $MenuBeenden
    Exit

    Case $ButtonBeenden
    Exit

    Case $MenuClipboard
    $textClipBoard = 'Noch '& $calcMonate& ' Monate, ' & $calcTage & ' Tage, '& $calcStunden & ' Stunden, ' & $calcMinuten & ' Minuten und ' & $calcSekunden & ' Sekunden.' & @CRLF & 'Du hast '&$GeschafftTage & ' von insgesamt ' & $GesamtTage & ' Tagen geschafft!!! ( ' & ROUND($ProgressState, 1) & '% )'
    _ClipBoard_SetData($textClipBoard, $CF_TEXT)
    MsgBox(64, "Zwischenablage", "Die Restzeit wurde in die Zwischenablage kopiert und kann jetzt in ein (Text-) Programm eingefügt werden.", 5)


    Case $MenuInfo
    MsgBox(64, "Info", "Wienrode-O-Meter: Ausschließlich und nur für ************." & @CRLF & "__________________________________________________" & @CRLF & @CRLF & "© 2009 - ***********")

    EndSwitch
    WEnd

    [/autoit]


    so komm ich von 20% Last ohne sleep und Timerinit auf 0-1% mit timerinit und ohne sleep ;)

  • so komm ich von 20% Last ohne sleep und Timerinit auf 0-1% mit timerinit und ohne sleep ;)

    ach ja... sehr schön, genau so hab ich mir das vorgestellt. Danke :)