Wie Endlos-Schleife mit wenig CPU Last "bauen"?

  • Mag sein, dass es nicht zu den "Core Competenzen" von Autoit gehört, aber ich benutze es für ein paar schlichte Dinge, die immer wieder automatisch ablaufen müssen.

    Hierzu meine Fragen:

    1.) While 1 [50 Zeilen Code] WEnd
    Was sollte man tun, um die Endlosschleife so wenig wie möglich Prozessor-Konsumierend zu gestaten, gegeben, dass die 50 Zeile Code einfach sind und daher ziemlich schnell abgearbeitet sind (sagen wir mal, 10 ms)?

    Ist ein sleep(100) tatsächlich "prozessorfreundlich" oder gibt es da besseres?


    2.) AutoIt Eventabhängig starten
    Bestimmt kann man AutoIt (wie jedes Programm) auch abhängig von bestimmten Events Starten. Allerdings fehlen mir dazu ein wenig die Kenntnisse, was (auf einem Windowssystem) so alles "geht". Daher (mal wieder) eine Anfängerfrage:

    Gibt es irgendwo so etwas wie ein "How to Start and AutoIt Events Based" oder ein "Cookbook for Events Based AutoIt"?

    1000 Danke vorab
    jwka

  • Moin, hoffe das hilft dir weiter :) , habe selber noch nicht mit dem On Event Mod gearbeitet aber sollte meiner Meinung nach so klappen ^^ , GUI natürlich noch hinzufügen..

    [autoit]


    Opt("GUIOnEventMode", 1) ; On Event Mod einschalten (somit keine While mehr nötig)
    AdlibRegister('_deineFunc','1000') ; Func = Funktion die aufgerufen werden soll, Timeout = Intervall indem die Funktion aufgerufen werden soll somit wird
    AdlibUnRegister() ; erklärt sich von selber
    GUISetOnEvent($GUI_EVENT_CLOSE, '_AutoitExit')

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

    Func _AutoitExit()
    MsgBox(2,'Exit','Programm wird nun beendet')
    Exit
    EndFunc

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

    Func _deineFunc()
    ;Mach irgend was :) alle 1000 MS
    ;...
    EndFunc

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


    Gruß Marvin

  • Ähm was soll das Script bewirken? Du registrierst eine Funktion mit AdlibRegister und deregsitrierst die Funktion auch gleich wieder mit AdlibUnRegister().

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • 1.) While 1 [50 Zeilen Code] WEnd
    Was sollte man tun, um die Endlosschleife so wenig wie möglich Prozessor-Konsumierend zu gestaten, gegeben, dass die 50 Zeile Code einfach sind und daher ziemlich schnell abgearbeitet sind (sagen wir mal, 10 ms)?

    Ist ein sleep(100) tatsächlich "prozessorfreundlich" oder gibt es da besseres?

    Wenn mit GUIGetMsg arbeitest brauchst kein sleep in der schleife, die "Pause" bewirkt GUIGetMsg schon direkt.



    2.) AutoIt Eventabhängig starten
    Bestimmt kann man AutoIt (wie jedes Programm) auch abhängig von bestimmten Events Starten. Allerdings fehlen mir dazu ein wenig die Kenntnisse, was (auf einem Windowssystem) so alles "geht". Daher (mal wieder) eine Anfängerfrage:

    Was verstehst du unter starten?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • chip dass soll doch kein Funktionsfähiges Programm sein sondern nur eine Vorstellung der Funktionen die er benötigen wird bzw ein Teil davon

    Gruß Marvin

  • Falls du eventuell kleinere Schleifen hast, dann setz ganz unten einfach

    [autoit]

    sleep(1)

    [/autoit]

    dann wird die Schleife eventuell halt "nur" 500 mal pro sekunde ausgeführt ( Überprüfungen brauchen ja auch ein wenig Zeit ), aber das ist ja immernoch schnell genug für select.

    mfg
    Hauke

  • Zitat

    dann wird die Schleife eventuell halt "nur" 500 mal pro sekunde ausgeführt


    In der Theorie... Leider ist die Sleep Funktion bei Werten unter 50 Millisekunden extrem ungenau. Und weniger als 10 - 20 ms sind meistens sowieso nicht drin. Wenn du Zeit hast, 5 Minuten auf deine Berechnung zu warten, dann fügst du halt ein Sleep(1000) ein. Das wäre wohl "Prozessorfreundlich". Allerdings ist der Prozessor nunmal da um Dinge zu berechnen, und er wird auch nicht sofort komplett ausgelastet sein von ein paar kleineren Berechnungen. Selbst umfangreichere Rechnungen wie die von einigen 2D Spielen hier im Forum lasten den Prozessor bei einer Pause von 20 ms nicht allzu sehr aus. Wenn du sofort Ergebnisse sehen willst, dann lass das Sleep weg. Es wird nicht sofort den Prozessor überhitzen...

  • Sleeps kannst du übrigens auch per Adlibregister zwischenschieben, dann läuft deine Schleife eventuell etwas besser ;)

    [autoit]

    AdlibRegister("_test", 20)
    While 1
    $x = 42
    WEnd
    Func _test()
    Sleep(10)
    EndFunc

    [/autoit]