Что нового

[Баг] Округление функции Sleep

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Заметил что Sleep() стал дискретным (в AutoIt v3.3.6.1 кажется этого не было). Например от1ms до 10 ms всегда равна 10ms, 11ms до 20ms всегда равна 20ms и т.д

Тест пример:
Код:
$ms = 1
While 1
	Sleep(100)
	$ms = InputBox("  ", "Тестируемое время в ms", $ms)
	Select
		Case @error = 1
			Exit
	EndSelect


	$st = TimerInit();1 тест Sleep()
	For $i = 1 To 5
		Sleep($ms)
	Next
	$t1 = Round(TimerDiff($st) / 5, 0)


	$st = TimerInit();2 тест через TimerDiff()
	For $i = 1 To 5
		_Sleep($ms)
	Next
	$t2 = Round(TimerDiff($st) / 5, 0)


	MsgBox(0, '', 'Длительность Sleep()' & @CR & $ms & 'ms =: ' & $t1 & 'ms' & @CR & @CR & 'Длительность TimerDiff()' & @CR & $ms & 'ms =: ' & $t2 & 'ms')
	$ms += Random (6,9,1)
WEnd



Func _Sleep($time_Sleep)
	Local $st_Sleep = TimerInit()
	While 1
		If TimerDiff($st_Sleep) >= $time_Sleep Then
			ExitLoop
		EndIf
	WEnd
EndFunc   ;==>_Sleep
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Баг] Дискретность функции Sleep

А почему дискретность?
Скорее округление.

Да, проблема есть, и в ранних версиях также было.

P.S.
Sleep через Timer* для одной мс это не выход, т.к это даёт нагрузку на процессор.
 
Автор
R

rusreg79

Продвинутый
Сообщения
159
Репутация
57
P.S.
Sleep через Timer* для одной мс это не выход, т.к это даёт нагрузку на процессор.
и верно... тогда так
Код:
$dll_kernel32 = DllOpen("kernel32.dll")

_Sleep(1000)
Func _Sleep($ms)
DllCall($dll_kernel32, "DWORD", "Sleep", "int", $ms)
EndFunc

DllClose($dll_kernel32)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
Func _Sleep($iDelay)
	Local $Timer = TimerInit()
	While TimerDiff($Timer) <= $iDelay
		; Nothing
	WEnd
EndFunc   ;==>_Sleep
 
Верх