Что нового

Скрипт съедает память и крэшится (ошибка в bmpsearch)

vova-n

Новичок
Сообщения
23
Репутация
0
Продолжаю писать бота для игры. После нескольких недель использования pixelsearch и pixelgetcolor понял насколько они могут быть быть не надёжны. На сайте игры произошли какие-то изменения и всё перестало работать. Прям вот с начала и до конца. Мышь промахивается. Пиксели не тех цветов. Координаты известных цветов неверны. Решил бороться через bmpsearch. Собственно родилась такая вот внутренняя функция, которая подготавливает BMPsearch к работе, производит щелчок мыши, засыпание и удаляет объекты.
Код:
Func MoveClickSleep($xPos, $yPos, $speed, $sleep) ;X Y скорость мыши и засыпание
	MouseMove($xPos, $yPos, $speed)
	MouseClick("left", $xPos, $yPos, 1, 1)
	Sleep($sleep)
EndFunc   ;==>MoveClickSleep

Func ClickIfPictureSleep($pic, $sleep1)
	_GDIPlus_Startup()
	Local $hBitmap0 = _ScreenCapture_Capture()
	Local $hImage0 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap0)
	Local $hSource0 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage0)
	Local $hBmp0 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\" & $pic)
	Local $hFind0 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp0)
	Local $aCoords0 = _BmpSearch($hSource0, $hFind0)
	If Not @error Then
		MoveClickSleep($aCoords0[1][2] + Int(($aCoords0[1][0]) / 2), $aCoords0[1][3] + Int(($aCoords0[1][1]) / 2), 2, $sleep1)
		Return SetError(0)
	Else
		Return SetError(1)
	EndIf
	$aCoords0 = 0
	_WinAPI_DeleteObject($hBitmap0)
	_GDIPlus_BitmapDispose($hImage0)
	_WinAPI_DeleteObject($hSource0)
	_GDIPlus_BitmapDispose($hBmp0)
	_WinAPI_DeleteObject($hFind0)
	_GDIPlus_Shutdown()
EndFunc   ;==>ClickIfPictureSleep

Не знаю есть ли смысл приводить весь код целиком - у вас он просто не запустится. Но суть такая. Есть пять аккаунтов. И цикл от 1 до 5. В теле цикла по сути просто всё время ищутся картинки и кликается по ним. А иногда и просто без поиска картинок по другим условиями происходит щелчок мыши.

Проблема в том что периодически программа крешится с одной и той же ошибкой (см. картинку). Почему периодически? Потому что я постоянно вношу изменения и иногда всё ок. Иногда крэш. Например в последний раз я попытался уйти от циклов где много раз выполняется моя функция ClickIfPictureSleep. Так вот стало хуже. В цикле сейчас крутится простой pixelchecksum. Ошибка всегда одна и та же. Что-то не так с bmpsearch.

Если надо могу выложить рабочий код и оптимизированный, но не рабочий. Но мне кажется что я что-то не так делаю внутри своей функции ClickIfPictureSleep.

Почему-то не могу вложить картинки...
oshibka.png

kresh1.png

kresh2.png
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
vova-n, у вас скрипт не доходит до очистки памяти
Код:
Func ClickIfPictureSleep($pic, $sleep1)
	_GDIPlus_Startup()
	Local $hBitmap0 = _ScreenCapture_Capture()
	Local $hImage0 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap0)
	Local $hSource0 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage0)
	Local $hBmp0 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\" & $pic)
	Local $hFind0 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp0)
	Local $aCoords0 = _BmpSearch($hSource0, $hFind0)
	If Not @error Then
		MoveClickSleep($aCoords0[1][2] + Int(($aCoords0[1][0]) / 2), $aCoords0[1][3] + Int(($aCoords0[1][1]) / 2), 2, $sleep1)
		Return SetError(0) ; Выход из функции
	Else
		Return SetError(1) ; Выход из функции
	EndIf
	$aCoords0 = 0 ; Это не обязательно
	; Очистка
	_WinAPI_DeleteObject($hBitmap0)
	_GDIPlus_BitmapDispose($hImage0)
	_WinAPI_DeleteObject($hSource0)
	_GDIPlus_BitmapDispose($hBmp0)
	_WinAPI_DeleteObject($hFind0)
	_GDIPlus_Shutdown()
EndFunc   ;==>ClickIfPictureSleep
 
Автор
V

vova-n

Новичок
Сообщения
23
Репутация
0
Tempo сказал(а):
у вас скрипт не доходит до очистки памяти


Спасибо большое! Неожиданный для меня подвох. Теперь всё работает как надо. Добавил очистку памяти перед каждым Return.
vsyo_okey.png
 
Верх