CPU Überlastung mit diesem Timer?

  • bau mir grad n shutdownskript (ja weiß dass es sowas schon haufenweise gibt). wollt n timer bis zum shutdownbefehl laufen lassen und nebenbei ne gui bit button fürn abbruchsbefehl. da autoit ja nich mehrere sachen gleichzeitig machen kann und ich das prog nich in zwei skripte teilen wollte hab ich mich n bisschen mit adlibregister() befasst und rumgebastelt bis ich jetz rausgefunden hab dass ich den ganzen kram vom adlibregister weglassen kann und das ganze n bischen eleganter lösen kann.
    augenscheinlich funktionierts ganz gut und hatte bis jetz noch keine fehler beim testen.
    denke eigentlich dass es die cpu ganz schön belasten sollte (eigentlich) aber dem is denk ich nich so. hab den taskmanager zur cpu-überwachung mitlaufen lassen und ne fiktive zeit von 10minuten eingestellt aber keine belastung feststellen können.
    kann mir jemand sagen ob das skript wirklich so ressurchensparend is wie ich denke?

    [autoit]

    #include <GUIConstantsEx.au3>

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

    Local $msg, $button
    $timer = TimerInit()

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

    GUICreate("MyGUI")
    $button = GUICtrlCreateButton("Button", 10, 10)
    GUISetState(@SW_SHOW)

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    If $msg = $button then Exit
    If TimerDiff($timer) <60200 and TimerDiff($timer) > 59800 Then MsgBox(64, "", " 1Minute vergangen")
    If TimerDiff($timer) > 600000 Then ExitLoop
    WEnd

    [/autoit]

    edit: müsste doch eigentlich permanent die TimerDiff($timer) checken und somit ne menge speicher verbraten oder?

    Einmal editiert, zuletzt von snuz (23. Juni 2010 um 16:49)

  • Klar der Messageloop-Modus ist schon recht gut optimiert.
    Besser (minimal) wirds nurnoch im Onevent-Modus.


    das haben mir andere auch schon gesagt ... raff nur nich wie ich den richtig einsetz^^

    andere frage: hab die "if ... < 60200 ... > 59800 ... " noch aus der alten adlibregister()-func übernomen weil die nur alle 100ms die timerdiff gecheckt hat damit das prog die zeit nich verpasst... wenn das skript jetz permanent checkt kann ich doch n konkreten zeitpunkt "... =60000" angeben und nich n zeitraum " > ... < ..." oder lauf ich dann trotzdem gefahr dass das skript genau zu dem zeitpunkt nich checkt?

  • Müsste funzen (ungetestet)

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Local $msg, $button
    Global $Check = 0

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

    GUICreate("MyGUI")
    $button = GUICtrlCreateButton("Button", 10, 10)
    GUISetState(@SW_SHOW)

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

    AdlibRegister("Check", 1 * 60 * 1000)
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    If $msg = $button Then Exit
    If $Check = 10 Then ExitLoop
    WEnd

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

    Func Check()
    $Check += 1
    Switch $Check
    Case 1
    MsgBox(64, "", " 1Minute vergangen")
    Case 10
    AdlibUnRegister()
    EndSwitch
    EndFunc ;==>Check

    [/autoit]
  • Ja, da sind jetzt auch keine großen rechnerischen Funktionen drin, zbw. GDI+...
    Was noch das Script sparender macht wäre glaub ein "Sleep(20)" in der Mainloop, weil ich denk das die Kontrolle alle 50 ms reicht oder? ;)

    Edit: Zu deiner Frage, die Funktion "TimerDiff($timer)" gibt ja die aktuelle Zeit zurück, wenn du diese nun mit zb 50000ms auf Gleichheit kontrollierst, dann kann es sein wie du schon erkannt hast nicht funktioniert, also wäre ein >= bzw <= sicherer :D

  • Müsste funzen (ungetestet)

    funzt super! danke

    Ja, da sind jetzt auch keine großen rechnerischen Funktionen drin, zbw. GDI+...
    Was noch das Script sparender macht wäre glaub ein "Sleep(20)" in der Mainloop, weil ich denk das die Kontrolle alle 50 ms reicht oder? ;)

    Edit: Zu deiner Frage, die Funktion "TimerDiff($timer)" gibt ja die aktuelle Zeit zurück, wenn du diese nun mit zb 50000ms auf Gleichheit kontrollierst, dann kann es sein wie du schon erkannt hast nicht funktioniert, also wäre ein >= bzw <= sicherer :D

    hab ich auch grad rausgefunden :D hätt besser ma vorher ausprobiert als gleich gepostet *auf-die-eigene-schulter-klopf* :rolleyes:

    danke für die hilfe!
    frage beantwortet --> topic closed

  • Hallo snuz,

    hier noch ein ganz anderer Ansatz, um zu einer bestimmten Zeit an einem bestimmten Tag Alarm zu geben:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <DateTimeConstants.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)

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

    Global $hGui, $msg, $button, $Event, $Start, $timer = TimerInit(), $sDateTime

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

    $hGui = GUICreate("MyGUI")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUICtrlCreateLabel("Aktion am: um:",10,10,200,20)
    $Event =GUICtrlCreateDate("", 10, 30, 150, 20, $DTS_TIMEFORMAT)
    ; Um ein bestimmtes Standardformat auszuwählen
    Global $DTM_SETFORMAT_ = 0x1032 ; $DTM_SETFORMATW
    Global $style = "dd.MM.yyyy HH:mm"
    GUICtrlSendMsg($Event, $DTM_SETFORMAT_, 0, $style)
    $Start = GUICtrlCreateButton("&Start", 200, 30)
    GUICtrlSetOnEvent(-1,"_Start")
    $button = GUICtrlCreateButton("&Ende", 10, 80)
    GUICtrlSetOnEvent(-1, "_exit")
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    If TimerDiff($timer) > 600000 Then Exit
    WEnd

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

    Func _Start()
    AdlibRegister("_CheckEvent",10000) ;alle 10 Sekunden checken
    EndFunc

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

    Func _CheckEvent()
    Local $sEvent = GUICtrlRead($Event)
    $sDateTime = @MDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN
    WinSetTitle($hGui, "", "MyGui " & $sDateTime)
    ConsoleWrite($sEvent & " " & $sDateTime & @CRLF)
    if $sDateTime = $sEvent Then
    MsgBox(64, "Es ist jetzt", $sDateTime)
    AdlibUnRegister()
    EndIf
    EndFunc ;==>_CheckEvent

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

    Func _exit()
    Exit
    EndFunc ;==>_exit

    [/autoit]

    mfg (Auto)Bert