Beep hat genauere Sleepzeiten als Sleep ?

  • Moin,

    Bestimmt schon aufgefallen ist die Eigenart von Sleep, dass diese Funktion nur in 10ms intervallen (oder iwie ganz komisch) funktioniert.

    Eben (beim Bau einer Eieruhr) habe ich mal wieder den Beep ausgepackt.
    Und war nicht sicher wie viel ms denn sinnvoll sind.

    Dabei hab ich aus Spaß mal 5ms genommen und erstaunt festgestellt, dass die Dauer tatsächlich recht nah an die 5ms ran kommt.
    Ein Sleep(5) macht bei mir immer 10,5ms Pause, ein Beep(5) nur in etwa 5,5.

    Vorallem in kleinen Bereichen <20ms ist Sleep für geregelte Abläufe (die eine gewisse Konstanz haben sollen) wichtig.
    Der Nanosleep (per DelayExecution oder WaitableTimer DllCall) funktioniert oft nicht ordnungsgemäß. An manchen Computern zeigt er die gleichen Symptome wie der normale Sleep. An meinem HauptPC funktioniert der Nanosleep auch nur, wenn zuvor mal Firefox gestartet wurde. (seltsam). Und bei meinem Win7 Rechner wird auf magische Weise oft die Skriptgeschwindigkeit extrem erhöht, was troz Einstellung auf 40Frames teils 60+ zur Folge hat.

    gibts ggf ne Möglichkeit den Beep ohne Beep (also ohne Ton) zu nutzen ?
    Dann kann man ohne Dlls usw trotzdem konstante Frameraten erziehlen.

    Hier mal das Skript:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $m = 0.01, $t = 0, $n = $m * 600, $t = TimerInit(), $d = 0, $b = TimerInit(), $e = 0, $a = GUICreate('Eieruhr ' & $m & ' min', 225, 35), $c = GUICtrlCreateProgress(5, 5, 215, 25)

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

    GUISetState(@SW_SHOW, $a)

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

    While Not (GUIGetMsg() = -3)
    $d = Int(TimerDiff($t))
    If TimerDiff($b) >= $n Then
    GUICtrlSetData($c, Ceiling($d / ($m * 60 * 1000) * 100))
    If $d >= $m * 1000 * 60 Then
    $t = TimerInit()
    $e += 1
    _Signal()
    EndIf
    $b = TimerInit()
    EndIf
    WEnd

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

    Func _Signal()
    Local $s = 5, $y
    If Not Random(0, 1, 1) Then
    $y = TimerInit()
    Beep(1000, $s)
    $y = TimerDiff($y)
    ConsoleWrite('Beep: ' & $s & ' ' & Round($y, 2) & ' ms' & @CRLF)
    Else
    $y = TimerInit()
    Sleep($s)
    $y = TimerDiff($y)
    ConsoleWrite('Sleep: ' & $s & ' ' & Round($y, 2) & ' ms' & @CRLF)
    EndIf
    EndFunc ;==>_Signal

    [/autoit]

    lg
    M

  • Ich habe mal gelesen das Sleep eine mindestzeit von 10ms hat was sich bei meinem Ergebnis auch wiederspiegelt.

    Beep ca. 4,45
    Sleep ca. 9,83

  • Hallo Marsi:

    der beep ist bei mir total unzuverlässig. Ich habe mit folgendem Skript getestet:

    [autoit]

    for $i = 1 to 100
    $tStart =TimerInit()
    Beep(32767,$i)
    $tDiff = TimerDiff($tStart)
    ConsoleWriteError($i & @TAB & $tDiff & @crlf)
    Next

    [/autoit]

    hier das Egebnis:

    Spoiler anzeigen

    hast du den Ton gehört?

    mfg autoBert