Что нового

[Процессы] Не стабильность работы TimerInit() TimerDiff() - помогите исправить

forfrends

Новичок
Сообщения
176
Репутация
3
Добрый день!
У меня возникла проблема. Я в скрипте использую TimerInit() и TimerDiff() для отслеживания времени. Выход из цыкла должен происходить только если найдена картинка или прошло 7 минут (420000 милисекунды), но часто выход происходит через короткое время, то что картинка не найдена - это точно. Значит проблема в TimerDiff()

Вот тот кусок кода где эта функция используется:

Код:
#include <Timers.au3>

$hTimer = TimerInit()
While 3
	_otsl() ; - это функция с кучей пикселсирчем - ищу картинку
	If $otsl6 = True Then
		$otsl6 = False
		Sleep(Random(5000, 20000, 1))
		_otsl() ; - это функция с кучей пикселсирчем - ищу картинку
		If $otsl6 = True Then
			ExitLoop
		EndIf
	EndIf
	Sleep(50)
	$iDiff = TimerDiff($hTimer)
	If $iDiff > 420000 Then
		ExitLoop
	endIf
WEnd


Я подумал, может TimerDiff() не обнуляется при новом вызове?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
forfrends
Поставь перед каждым ExitLoop MsgBox() с пояснением, и будешь точно знать причину завершения цикла...
 
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
Так и делал. Выяснил что выход происходит из-за TimerDiff()
То есть TimerDiff срабатывает раньше времени - через 5 сек. - 1 мин.
 

Asshaker

Знающий
Сообщения
150
Репутация
17
Код:
$hTimer = TimerInit() ; Запускает таймер и хранит дескриптор в переменной
Sleep(3000)
$iDiff = TimerDiff($hTimer) ; Возвращает разницу во времени, от предыдущего запуска TimerInit, дескриптор которого указан в переменной
MsgBox(0, "Разница во времени", $iDiff)

у меня возвращает 3001.1234556 и т.п.
А значит ты сравниваешь число с точкой.
З.Ы. Попробуй через
Код:
@MIN
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Asshaker [?]
А значит ты сравниваешь число с точкой.
И что Вы этим хотели сказать? AutoIT по барабану какой тип сравнивать :smile:
 
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
так или иначе 3001.1234556 - это чило и оно больше, меньше или равно 420000
так что в условии ошибки не вижу.
попробую отбросить дробную часть, может поможет....
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
forfrends [?]
то что картинка не найдена - это точно
Как это проверяется?

[?]
выход происходит из-за TimerDiff()
С трудом верится...

Что выдаёт тут:
Код:
$hTimer = TimerInit()
While 1
    _otsl() ; - это функция с кучей пикселсирчем - ищу картинку
    If $otsl6 = True Then
        $otsl6 = False
        Sleep(Random(5000, 20000, 1))
        _otsl() ; - это функция с кучей пикселсирчем - ищу картинку
        If $otsl6 = True Then
            MsgBox(16, '', 'Выход не по TimerDiff')
            ExitLoop
        EndIf
    EndIf
    Sleep(50)
    If TimerDiff($hTimer) > 420000 Then
        MsgBox(64, '', 'Выход по TimerDiff')
        ExitLoop
    EndIf
WEnd



P.S.
А в функции _otsl случаем не используется переменная $hTimer?
 
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
$hTimer используется один - единственный раз во всем коде и больше нигде не повторяется.


Добавлено:
Сообщение автоматически объединено:

Что выдаёт тут:
Код: AutoIt [Выделить]
$hTimer = TimerInit()
While 1
_otsl() ; - это функция с кучей пикселсирчем - ищу картинку
If $otsl6 = True Then
$otsl6 = False
Sleep(Random(5000, 20000, 1))
_otsl() ; - это функция с кучей пикселсирчем - ищу картинку
If $otsl6 = True Then
MsgBox(16, '', 'Выход не по TimerDiff')
ExitLoop
EndIf
EndIf
Sleep(50)
If TimerDiff($hTimer) > 420000 Then
MsgBox(64, '', 'Выход по TimerDiff')
ExitLoop
EndIf
WEnd

Я так и проверял - выяснилось что выходит раньше времени из-за TimerDiff(), хотя не должно


Добавлено:
Сообщение автоматически объединено:

Проверить все случаи не представляется возможности, так как программа выдает "глюк" примерно раз 8 в сутки, может и больше, но ночью не могу следить за работой программы
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
А какое значение возвращает TimerDiff при выходе из цикла?

Код:
$hTimer = TimerInit()
While 1
    _otsl() ; - это функция с кучей пикселсирчем - ищу картинку
    If $otsl6 = True Then
        $otsl6 = False
        Sleep(Random(5000, 20000, 1))
        _otsl() ; - это функция с кучей пикселсирчем - ищу картинку
        If $otsl6 = True Then
            MsgBox(16, '', 'Выход не по TimerDiff')
            ExitLoop
        EndIf
    EndIf
    Sleep(50)
    If TimerDiff($hTimer) > 420000 Then
        MsgBox(64, '', 'Выход по TimerDiff' & @CRLF & TimerDiff($hTimer))
        ExitLoop
    EndIf
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А зачем там Timers.au3? Выкладывай лучше весь код.
 
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
А какое значение возвращает TimerDiff при выходе из цикла?
выдает число большее 420000

А зачем там Timers.au3? Выкладывай лучше весь код.

весь код - это 2000 строк...
Суть такая - цикл поиска нужной картинки, если картинка найдена - выход из цыкла.
Если прошло 7 минут (420000 милисекунд) а картинка не найдена - выход из цыкла.

Спасибо, кажется все исправил - переписал структуру кода чуть выше указанного примера - ошибка пропала.
В чем был глюк так и не понял.
Всем спасибо!
 
Верх