Wait/Timer Ticks sind zu langsam Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Messoras

Wait/Timer Ticks sind zu langsam  Topic is solved

Post by Messoras » 25 Apr 2021, 19:11

Hallo zusammen, ich arbeite jetzt schon eine Weile mit Autohotkey und habe ein Programm, dass alle 100 Millisekunden etwas nachprüfen und je nach Zustand ein paar Knöpfe drücken soll. Klappt soweit eigentlich alles ganz gut, aber wenn ich zB

Code: Select all

Wait, 100
oder

Code: Select all

SetTimer, 100, ..
benutze, wartet das Programm nicht 100, sondern 140-141 Millisekunden. Soll das Programm 10 Millisekunden warten, wartet es sogar 16 Millisekunden. Ich habe schon überprüft, ob die Scriptengine vielleicht zu langsam tickt, aber ich habe folgendes Skript geschrieben um es zu testen:

Code: Select all

#NoEnv
SendMode Input

otime := A_TickCount
toggletc := true
delay := 0
DelayCounter:
if (toggletc) {
    delay := A_TickCount - otime
    otime := A_TickCount
    SetTimer, DelayCounter, 1000
}
F1::
MsgBox, %delay%
F2::
toggletc := !toggletc

delay ist hier immer 110.
Wenn ich den Timer mit 10 starte kommt delay bei 15-16 raus, bei 1000 schwankt es zwischen 1000 und 1032.
Das gleiche gilt übrigens auch für Wait + Goto.
Kann ich irgendwas tun, um das zu beheben?

gregster
Posts: 8940
Joined: 30 Sep 2013, 06:48

Re: Wait/Timer Ticks sind zu langsam

Post by gregster » 25 Apr 2021, 19:18

Ist Wait tatsächlich ein funktionierendes Synonym zu AHK's Sleep ? Zumindest verlinkt es dahin... :think:
Edit: Ist offenbar im Docs-Index so eingetragen :problem: Naja, bei mir wirft Wait, 100 jedenfalls nen Fehler.

Die Erklärung für das (systembedingte) Verhalten findest du jedenfalls in den Sleep-Docs unter Bemerkungen: https://ahkde.github.io/docs/commands/Sleep.htm#Remarks

Beispiel #3 "[z]eigt, wie ein Sleep kleiner als die üblichen 10 oder 15.6 Millisekunden erzeugt werden kann", mittels DllCalls: https://ahkde.github.io/docs/commands/Sleep.htm#ShorterSleep
Genauer wirst du es mit Windows auf Standard-Hardware wahrscheinlich nicht hinkriegen.

Messoras

Re: Wait/Timer Ticks sind zu langsam

Post by Messoras » 25 Apr 2021, 21:05

Ich finde nur eine 10% Abweichung bei Zehntelsekunden schon ziemlich krass. Da die Verzögerungen offenbar auch häufig schwanken, bin ich nicht sicher, ob es sinnvoll ist den Koeffizienten für die Sleep-Dauer anzupassen, wie im Beispiel gegeben. Ich denke, ich werde wohl in meinem Programm die vorhergegangene Verzögerung messen und abhängig davon die Sleep-Dauer variabel anpassen, so dass die Konstanz auch bei langen Laufzeiten noch gegeben ist.
Die Thematik kam mir nur bis jetzt quasi gar nicht in die Quere, da ich eher mit C und C# arbeite, wo die Runnable Instanzen äußerst präzise arbeiten.

Danke für die Antwort!

LG,
Messoras

just me
Posts: 9432
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Wait/Timer Ticks sind zu langsam

Post by just me » 26 Apr 2021, 04:46

Moin,

wenn Du die Abweichungen minimieren willst, solltest Du zumindest

Code: Select all

SetBatchLines, -1
verwenden. Sonst legt das Skript immer wieder erzwungene 'Kunstpausen' ein.
Ansonsten ist es üblicherweise so, dass die Abweichung umso größer werden kann, je kleiner die Wartezeit ist.


delay ist hier immer 110.
Das halte ich bei

Code: Select all

    SetTimer, DelayCounter, 1000
eher für unwahrscheinlich. ;)

Messoras

Re: Wait/Timer Ticks sind zu langsam

Post by Messoras » 26 Apr 2021, 14:03

Stimmt, ich hatte bei natürlich bei Sleep(100) eine Delay von 110 Millisekunden, nicht bei 1000. Habe jetzt eine Variable eingeführt, die die Gesamtverzögerung mitnimmt und vom Timer abgezogen wird. Dadurch schwankt der Abstand zwischen den Funktionsaufrufen zwar zwischen 80 und 120, aber dafür ist das Programm auch nach einer halben Stunde noch auf die Sekunde genau.
Sieht jetzt etwa so aus:

Code: Select all

delayTotal := 0
otime := A_TickCount
Function:
if (toggle == 1) {
    d := 100 - delayTotal
    if (d < 10) {
        d := 10
    }
    SetTimer, Function, %d%
    delay := A_TickCount - otime
    otime := A_TickCount
    delayTotal := delayTotal + delay - 100
    ; Do Stuff here ...
}
Ich probiere mal noch die Schwankungen in den Griff zu bekommen und schmeiße auch das Die BatchLines mit rein. Beim Herumprobieren mit verschiedenen Sleep Intervallen ist mir übrigens aufgefallen, dass alles unter 94 deutlich unter 100 ms tatsächliche Verzögerung verursacht, alles über 95 deutlich über 100. Gerade bei 95 sind die größten Schwankungen zu verzeichnen. Ich vermute da knallt die Rundung ordentlich rein.
Danke für die Hilfe, ich melde mich nochmal, wenn ich was effizienteres gefunden habe.

LG,
Messoras

Post Reply

Return to “Ich brauche Hilfe”