Что нового

Альтернативные варианты задержки выполнения скрипта

xamd

AION bot developer
Сообщения
66
Репутация
24
Уважаемые товарищи, подскажите пожалуйста, как можно реализовать повторный вызов функции после некоторой задержки? Вариант sleep() не предлогать, он грузит систему и при нем не работает обработка GUI формы.

Слышал есть вариант какой-то с timer.au3?
Можно линки или готовую инфу?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Таймер

TimerInit()
TimerDiff()
Каждое определенное время как нужно юзать функцию, сбрасываешь Таймер Инит и начинаешь по новой, и так ставишь проверку в основном цикле, иначе AddLibEnable
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Таймер

xamd
{TopicNameWarn.Admin}



[?]
sleep() не предлогать, он грузит систему
Ничего он не грузит, как раз наоборот.


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

И эта тема общая, с ботами напрямую вроде не связана...
 
Автор
X

xamd

AION bot developer
Сообщения
66
Репутация
24
Re: Таймер

http://www.autoitscript.com/autoit3/docs/functions/TimerInit.htm - оно не кажется мне полезным.
Если только в цикле проверять это значние, и если оно больше или равно интервалу, то вызывать функцию. А сами эти 2 функции запихнуть в while 1 .... wend.

Ты предлагаешь так?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Таймер

Связана связана, тут обсуждается то, как оббафывать себя раз в определенный промежуток времени, кстати в разделе для новичков есть ряд тем относящихся к нашему разделу, как они там утихнут я хотел бы их выдернуть к нам :з


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

xamd сказал(а):
http://www.autoitscript.com/autoit3/docs/functions/TimerInit.htm - оно не кажется мне полезным. Если только в цикле проверять это значние, и если оно больше или равно интервалу, то вызывать функцию. А сами эти 2 функции запихнуть в while 1 .... wend. Ты предлагаешь так?
Я предлагаю тебе создать функцию в которой будет иницииализироваться таймер и потом сравнивать текущее время и время начала, и если оно больше скольки-то минут\секунд - выполнять какое-то действие, обнулять таймер и стартовать по новой.
 
Автор
X

xamd

AION bot developer
Сообщения
66
Репутация
24
Тут дело не в бафе, а в запросе своих статов из памяти. Например, того же ХП -> тебя бьют, хп меньше. Если юзать sleep(), то GUI просто отваливается. Мне надо реализовать такой вариант, когда будет работать GUI и цикл с задержкой.

К ботам это имеет косвенное отношение, однако если подумать, то подобными вещами интересуются 98% ботоводов, и свой вопрос начнут искать именно в этом разделе. Я бы сделал именно так.


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

Ответ найден:

Код:
$begin = TimerInit() ; Начинаем отсчет

While 1 ; Бесконечный цикл
if (TimerDiff($begin) > 3000) Then ; Если прошло 3 секнуды
	Msg("Текст с задержкой 3 секунды") ; Обращаемся к нужной функции
	$begin = TimerInit() ; Начинаем отсчет заново
EndIf
WEnd

Func Msg($text) ; Пользовательская функция
	MsgBox(0, "", $text) ; Вывод сообщения
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Вона смотри между While и Селект ты можешь подгрузить что угодно, While повторяется каждые 5 сек.
Код:
Func II()
    Global $LogicState;Душа бота
    While WinActivate("$CurWin")
        $Convo = FindAgentConversationWindow()
;~         Exit
        $LogicState = GetLogicState()
        ToolTip($LogicState, 0,0)
        Select 
            Case $LogicState = "Agent Window Opened | View Mission | Loaded | Space | On | Есть | Не определено"
                Sleep(5000)
            
            Case $LogicState = "Agent Window | Close Window | Loaded | Space | On | Есть | Не определено"
                Sleep(5000)
                
            Case $LogicState = "Locate Character Agent | Mission Not Requested | Empty | Station | Off | Нету | Не определено"
                ToDo("Locate Character Agent | Mission Not Requested", "Request Mission")
            Case $LogicState = "Locate Character Agent | Mission Not Requested | Empty | Station | Off | Нету | Compleate Mission"
                ToDo("Locate Character Agent | Mission Not Requested", "Request Mission")
                
            Case $LogicState = "Locate Character Agent | Mission Allready Requested | Empty | Station | Off | Нету | Не определено"
                ToDo("Locate Character Agent | Mission Allready Requested", "View Mission")
            Case $LogicState = "Locate Character Agent | Mission Allready Requested | Empty | Station | Off | Есть | Не определено"
                ToDo("Locate Character Agent | Mission Allready Requested", "View Mission")
                
            Case $LogicState = "Viewing Mission | Mission Not Accepted | Empty | Station | Off | Нету | Не определено"
                If CheckMission() Then ToDo("Viewing Mission | Mission Not Accepted", "Accept Mission")
                                
            Case $LogicState = "Viewing Mission | Mission Accepted | Empty | Station | Off | Нету | Не определено" 
                CheckMission()    
            Case $LogicState = "Viewing Mission | Mission Accepted | Loaded | Station | Off | Нету | Не определено"  
                CheckMission()
            Case $LogicState = "Viewing Mission | Close Window | Loaded | Space | Off | Есть | Не определено"  
                CheckMission()
            Case $LogicState = "Viewing Mission | Close Window | Loaded | Space | On | Есть | Не определено"  
                CheckMission()
            Case $LogicState = "Viewing Mission | Close Window | Loaded | Space | Off | Нету | Не определено"  
                CheckMission()
            Case $LogicState = "Viewing Mission | Mission Accepted | Empty | Station | Off | Есть | Не определено"  
                CheckMission()
            Case $LogicState = "Viewing Mission | Close Window | Empty | Space | Off | Есть | Не определено"  
                CheckMission()
            Case $LogicState = "Viewing Mission | Close Window | Empty | Space | Off | Нету | Не определено";Or $LogicState = "Viewing Mission | Close Window | Empty | Space | On | Есть | Не определено" 
                CheckMission()
            Case $LogicState = "Agent Window | Close Window | Loaded | Space | Off | Нету | Не определено"
                CheckMission()
                                
            Case $LogicState = "Agent Window Opened | View Mission | Loaded | Space | Off | Есть | Не определено" 
                ToDo("Agent Window Opened | View Mission", "View Mission")
            Case $LogicState = "Agent Window Opened | View Mission | Loaded | Space | Off | Нету | Не определено"  
                ToDo("Agent Window Opened | View Mission", "View Mission")
            Case $LogicState = "Agent Window Opened | View Mission | Empty | Space | Off | Есть | Не определено"
                ToDo("Agent Window Opened | View Mission", "View Mission")
            Case $LogicState = "Agent Window Opened | View Mission | Empty | Station | Off | Нету | Не определено"
                ToDo("Agent Window Opened | View Mission", "View Mission")
            Case $LogicState = "Agent Window | Close Window | Loaded | Space | Off | Есть | Не определено"
                ToDo("Autopilot On")
                
            ;Агент => Дроп Офф => Агент
            Case $LogicState = "Viewing Mission | Mission Accepted | Empty | Station | Off | Нету | Агент => Дроп Офф => Агент" 
                ToDo("Load Cargo")
            Case $LogicState = "Viewing Mission | Mission Accepted | Empty | Station | Off | Есть | Агент => Дроп Офф => Агент" 
                ToDo("Load Cargo")
                
            Case $LogicState = "Viewing Mission | Mission Accepted | Loaded | Station | Off | Есть | Агент => Дроп Офф => Агент"
                ToDo("Undock")
            
            Case $LogicState = "Viewing Mission | Mission Accepted | Loaded | Station | Off | Есть | Не определено"
                ToDo("Undock")
                
            Case $LogicState = "Agent Window Opened | View Mission | Loaded | Space | Off | Есть | Агент => Дроп Офф => Агент" 
                ToDo("Autopilot On")
            Case $LogicState = "Viewing Mission | Close Window | Loaded | Space | Off | Есть | Агент => Дроп Офф => Агент"
                ToDo("Autopilot On")
            
            Case $LogicState = "Viewing Mission | Close Window | Loaded | Space | On | Есть | Агент => Дроп Офф => Агент" 
                Sleep(5000)
            Case $LogicState = "Agent Window Opened | View Mission | Loaded | Space | On | Есть | Агент => Дроп Офф => Агент"
                Sleep(5000)
                
            Case $LogicState = "Viewing Mission | Close Window | Loaded | Space | Off | Нету | Агент => Дроп Офф => Агент"
                ToDo("Dock")
            
            Case $LogicState = "Agent Window Opened | View Mission | Loaded | Station | Off | Нету | Не определено" 
                ToDo("Agent Window Opened | View Mission", "View Mission")
            Case $LogicState = "Agent Window Opened | View Mission | Loaded | Station | Off | Нету | Агент => Дроп Офф => Агент" 
                ToDo("Agent Window Opened | View Mission", "View Mission")
            Case $LogicState = "Agent Window Opened | View Mission | Loaded | Space | Off | Нету | Агент => Дроп Офф => Агент"
                ToDo("Agent Window Opened | View Mission", "View Mission")
                
            ;Агент => Пикап => Дроп Офф => Агент
            Case $LogicState = "Viewing Mission | Mission Accepted | Empty | Station | Off | Нету | Агент => Пикап => Дроп Офф => Агент"
                ToDo("Move to Pickup")
                
            Case $LogicState = "Viewing Mission | Close Window | Empty | Space | Off | Есть | Агент => Пикап => Дроп Офф => Агент"
                ToDo("Move to Pickup")
                ToDo("Autopilot On")
                
            Case $LogicState = "Viewing Mission | Mission Accepted | Empty | Station | Off | Есть | Агент => Пикап => Дроп Офф => Агент"
                ToDo("Undock")
            
            Case $LogicState = "Viewing Mission | Close Window | Empty | Space | On | Есть | Агент => Пикап => Дроп Офф => Агент"
                Sleep(5000)
                
            Case $LogicState = "Viewing Mission | Close Window | Empty | Space | Off | Нету | Агент => Пикап => Дроп Офф => Агент"
                ToDo("Dock Pickup")
                
            Case $LogicState = "Agent Window Opened | View Mission | Empty | Space | Off | Нету | Агент => Пикап => Дроп Офф => Агент"
                ToDo("Autopilot On")
                
            
                
            Case $LogicState = "Agent Window Opened | View Mission | Empty | Space | On | Нету | Агент => Пикап => Дроп Офф => Агент"
                Sleep(5000)
            
            Case $LogicState = "Agent Window Opened | View Mission | Empty | Station | Off | Нету | Агент => Пикап => Дроп Офф => Агент"
                ToDo("Load Cargo")
                
            Case $LogicState = "Agent Window Opened | View Mission | Empty | Station | Off | Есть | Агент => Пикап => Дроп Офф => Агент"
                ToDo("Load Cargo")
                
            Case $LogicState = ""
            
            Case $LogicState = ""
            

            
            
            
            
            
            ;Завершение миссии
            Case $LogicState = "Viewing Mission | Mission Accepted | Loaded | Station | Off | Нету | Compleate Mission"
                ToDo("Viewing Mission | Mission Accepted", "Complete Mission")
            
            Case $LogicState = "Viewing Mission | Mission Not Accepted | Empty | Station | Off | Нету | Compleate Mission" 
                ToDo("Return Back to Agent")
                ToDo("Undock")
            Case $LogicState = "Agent Window | Close Window | Empty | Station | Off | Нету | Compleate Mission" 
                ToDo("Return Back to Agent")
                ToDo("Undock")
            Case $LogicState = "Agent Window | Close Window | Empty | Station | Off | Нету | Не определено"
                ToDo("Return Back to Agent")
                ToDo("Undock")
            Case $LogicState = "Viewing Mission | Mission Not Accepted | Empty | Station | Off | Нету | Агент => Дроп Офф => Агент"
                ToDo("Return Back to Agent")
                ToDo("Undock")
            
            Case $LogicState = "Agent Window | Close Window | Empty | Space | Off | Есть | Агент => Дроп Офф => Агент"
                ToDo("Autopilot On")
            Case $LogicState = "Agent Window | Close Window | Empty | Space | Off | Есть | Не определено" 
                ToDO("AutoPilot On")
            Case $LogicState = "Agent Window | Close Window | Empty | Space | Off | Есть | Compleate Mission"
                ToDO("AutoPilot On")
            
            Case $LogicState = "Agent Window | Close Window | Empty | Space | On | Есть | Не определено"
                Sleep(5000)
            Case $LogicState = "Agent Window | Close Window | Empty | Space | On | Есть | Compleate Mission"
                Sleep(5000)
            Case $LogicState = "Agent Window | Close Window | Empty | Space | On | Есть | Агент => Дроп Офф => Агент"
                Sleep(5000)
                
            Case $LogicState = "Agent Window | Close Window | Empty | Space | Off | Нету | Не определено"
                ToDo("Dock to Agent")
                
            Case $LogicState = "Viewing Mission | Mission Accepted | Loaded | Station | Off | Нету | Агент => Дроп Офф => Агент" 
;~                 MsgBox(0,"","Баг был тут")
;~                 ToDo("Check Mission")
                CheckMission()
;~             Case $LogicState = "Тип Окна Агента не определен | Loaded | Station | Off | Есть | Агент => Пикап => Дроп Офф => Агент"
;~                 ToDo("Undock")
                
            
                
            Case $LogicState = "Agent Window | Close Window | Empty | Space | Off | Нету | Compleate Mission"
                ToDo("Dock to Agent")
            Case $LogicState = "Agent Window | Close Window | Empty | Space | Off | Нету | Агент => Дроп Офф => Агент"
                ToDo("Dock to Agent")
                
            Case $LogicState = ""
                
            Case $LogicState = ""
                
            Case $LogicState = ""
                
            Case $LogicState = ""
                
            
                
            Case Else
                ClipPut(""&$LogicState&"")
                TestMsg("Незаданное условие"&@CR&$LogicState)
;~                 Exit
                Sleep(5000)
            EndSelect    
        Sleep(3000)
    WEnd
EndFunc
 
Автор
X

xamd

AION bot developer
Сообщения
66
Репутация
24
Используя sleep() мы сразу рубим возможность пользователя в любой момент закрыть бота.

В моем прошлом(пиксельном) варианте, GUI не откликался ни на какие нажатия, когда висел в sleep'е. Даже тему поднимал, сошлись на том, что косяк.... )
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
юзай AddLibEnable для обработки гуя когда запускаешь бота
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Belfigor [?]
Связана связана, тут обсуждается то, как оббафывать себя раз в определенный промежуток времени
Ну и где прямая связь с ботами? и кстати слово “оббафывать” мне тоже неизвестно :smile:


кстати в разделе для новичков есть ряд тем относящихся к нашему разделу, как они там утихнут я хотел бы их выдернуть к нам
Ссылки в студию (или в ПМ) плиз. Нечего им утихать, если они напряму связаны с ботами, то сразу же нужно (было) перенести.

xamd [?]
если подумать, то подобными вещами интересуются 98% ботоводов
И при этом не зная что данные манипуляций используются не только в ботах ;) - Этот вопрос буддет всплывать и в общем контексте, поэтому тема будет полезна не только ботоводам, а они (не ботоводы) не полезут искать в этом разделе ;)

свой вопрос начнут искать именно в этом разделе. Я бы сделал именно так
Неверное мышление/решение, а что если уже есть подобная тема в разделе для новичков, и в ней есть решение, вы будете создавать дубли, и заполнять форум лишней информацией. Искать нужно по всему форуму.

Belfigor [?]
В последних версиях это уже AdlibRegister ;)
 

unsend

Новичок
Сообщения
27
Репутация
2
Хех - вот потому что не знаешь слово оббафить - не понимаешь почему ето именно о оботах;)))
Шутко и офтоп:smile:
По теме - вопрос с подвисаниями в скриптах из за слипа я лично решил проще - бьешь основной скрипт на куски и каждый компилишь в отдельный ехе, потом делаешь общую отслеживающую обвязку и от туда либо gshel либо run. а по поводу таймингов - задаещь стартовое время и пересчитываешь его по событиям аля do until или аналоги - работает надежнее и вернее. Это не только в тему о ботах но и в целом работает для техже сервисов опроса и запуска функции по событию надежнее. По крайней мере такая конструкция работает сутками, а вот если содержимое screenscan.exe включить в общий скрипт - виснет из-за косяков с определенными функциями без которых никуда:
Код:
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)
$nScan = 0
While 1
For $i = 1 to 50
If PixelGetColor ( 10, 10) = $Color Then    
If PixelGetColor ( 20, 10) = $Color Then  
If PixelGetColor ( 10, 20) = $Color Then 
Run("./ScreenScan.exe")
  $nScan += 1
EndIf
EndIf
EndIf
Sleep(400)
Run("taskkill.exe /F /IM ScreenScan.exe", @SW_HIDE)
Next

WEnd

________________________________________
ЗЫ: Почему именно в такой форме IF стоит можете не спрашивать - так было надо в основной проге, а тут просто выгреб не правя - я думаю на OR заменить не трабл:smile:
 

Dimmak

Знающий
Сообщения
185
Репутация
9
Код:
Global $count_1, $count_2

$dll_kernel32 = DllOpen('kernel32.dll')

While 1

	$count_1 +=1
		If $count_1 > 150 ; Каждые 150ms запуск 'func_1'
			Call( 'func_1' )
			$count_1 = 0
		EndIf

	$count_2 += 1
		If $count_2 > 300 ; Каждые 300 ms запуск 'func_2'
			Call( 'func_2' )
			$count_2 = 0
		EndIf

	DllCall($dll_kernel32, 'DWORD', 'Sleep', 'int', 1) ; А скрипт работает на Sleep в 1 милисек.
WEnd
 
Верх