Автокликер Clickermann :: Форум
Основной раздел => Ошибки => Topic started by: justitdo on January 09, 2016, 12:25:51 AM
-
Всем привет. Пользовался скриптом больше года, все работало отлично. Сегодня случилась неприятность. Во время работы кликер стал вырубаться и появляется окно с предупреждением windows "Прекращена работа программы clickerman.exe". Начал анализировать, что происходит. Оказывается кликер падает в той части скрипта, когда выполняется запись числа в текстовый файл "9999.txt". Скрипт берет число из буфера и проверяет его наличие в этом файле, если оно там есть , то все в порядке, он работает дальше, а вот если его там нет, то кликер начинает его записывать и рушится. И я заметил такую особенность, что как раз сегодня размер файла "9999.txt" подошел к 1 мегабайту. Неужели ограничение в 1мб? Как тогда быть? Может как-то можно разделить его на несколько файлов, или сделать в одном несколько строк? Помогите пожалуйста, очень срочно нужно... Вот эта часть скрипта
GETSCREEN
IF_PICTURE_IN (340,315, 550, 370, "11.bmp")
dbLCLICK($_return1+20, $_return2+4)
WAITMS(50)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
WAITMS(50)
$comp = TFREAD("9999.txt", 1)
WAITMS(50)
$action = STRPOS($comp, $strclip)
IF($action > 0)
log("НЕТ",1)
KEYDOWN (#CTRL)
WAITMS (50)
KEYDOWN (#F4)
WAITMS (50)
KEYUP (#F4)
KEYUP (#CTRL)
WAITMS(500)
ELSE
log("ДА",0)
TFDELETE ("9999.txt", 1)
WAITMS(50)
TFWRITE("9999.txt", STRCONCAT($comp,$strclip," "))
WAITMS (150)
END_IF
P.S. сейчас проверил, действительно из-за длинны строки он вырубается. Чуть уменьшил её и все работает, сделал больше - кликер рушится.
-
Так как я не особо разбираюсь во всяких переменных и прочем, но рабочий скрипт нужен мне очень срочно, решил добавить еще один текстовый файл путем вставки после ELSE такого же кода. Скрипт проверяет первый файл, если число из буфера в нем есть, то выполняет заданное действие, а если нет, то ищет его во втором файле и если его там нет - добавляет. Протестировал, вроде бы работает.
$strclip = FROMCLIP()
WAITMS(50)
$comp = TFREAD("9999.txt", 1)
WAITMS(50)
$action = STRPOS($comp, $strclip)
IF($action > 0)
LCLICK(985,957) // 4500103
WAITMS(500)
else
$strclip = FROMCLIP()
WAITMS(50)
$comp = TFREAD("7777.txt", 1)
WAITMS(50)
$action = STRPOS($comp, $strclip)
IF($action > 0)
LCLICK(44,161) // 4486001
WAITMS(500)
else
TFDELETE ("7777.txt", 1)
WAITMS(50)
TFWRITE("7777.txt", STRCONCAT($comp,$strclip," "))
LCLICK(1826,199) // 28764
END_IF
END_IF
HALT
Как такой вариант? Или можно что-то покультурнее придумать?
-
Или может длина строки в текстовом файле ограничена этим размером? Кстати, я тут тему создавал, что кликер съедает всю оперативку, так вот сейчас эта проблема решилась. Значит забивала оперативку информация из текстового файла...
-
А какая длинна строки? Для 32 битных систем максимальное число 2147483647. Может быть в этом дело.
Зачем писать в другой файл когда можно начать новую строку
Вот что получилось, но сам как это работает не проверял.
GETSCREEN
IF_PICTURE_IN (340,315, 550, 370, "11.bmp")
dbLCLICK($_return1+20, $_return2+4)
WAITMS(50)
KEYDOWN (#CTRL) // Ctrl+C
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)
WAITMS (50)
$strclip = FROMCLIP()
WAITMS(50)
$tcount = TFCOUNT("9999.txt") // определяем количество строк в файле
WAITMS(50)
FOR($numstr=1,$numstr<$tcount+1) // в цикле проверяем каждую строку на совпадения
$comp = TFREAD("9999.txt", $numstr)
$action = STRPOS($comp, $strclip)
IF($action > 0)
$numstr=999999 // если совпало прерываем цикл
log("НЕТ",1)
KEYDOWN (#CTRL)
WAITMS (50)
KEYDOWN (#F4)
WAITMS (50)
KEYUP (#F4)
KEYUP (#CTRL)
WAITMS(500)
END_IF
END_CYC
IF($numstr!999999) // если в пердыдущем цикле совпадений не было
log("ДА",0)
FOR($numstr=1,$numstr<$tcount+1) // запускаем цикл по поиску короткой строки
$comp = TFREAD("9999.txt", $numstr)
$complen = STRLEN($comp) // определяем длинну строки
IF($complen < 100000) // если строка меньше 100000 то дописываем в неё
$numstr=999999
TFDELETE ("9999.txt", $numstr)
WAITMS(50)
TFWRITE("9999.txt", STRCONCAT($comp,$strclip," "),$numstr)
WAITMS (150)
END_IF
END_CYC
IF($numstr!999999) // если предыдущий цикл не нашел короткой строки то дописываем новую
TFWRITE("9999.txt", STRCONCAT($strclip," "))
WAITMS (150)
END_IF
END_IF
END_IF // это конец IF_PICTURE_IN, но у тебя там смотри сам что в скрипте
-
А какая длинна строки? Для 32 битных систем максимальное число 2147483647. Может быть в этом дело.
не, врядли изза этого. сам тестил
(http://i.imgur.com/0Tblr8K.png)
потом еще тесты, еще, кстати лучше использовать STRWRITELN ("file", "str", [rewrite]) чтоб при случае ошибки - файл не остался пустым.
в этоге пришел к выводу, что весь упор в STRCONCAT. он не может присоединить к мега строке еще чтото.
кстати отличное решение искать в отдной строке состоящей из тысяч подстрок, за счет этого скорость поиска - пару милисекунд (естественно при поиске последнего слова в строке). если разделить мегобайтную строку на отдельные строки (тестил со строками 30символов, это 33к строк) то скорость поиска последней строки увеличивается до десятка минут. конечно можно переводить строки в массив, так быстрее, 10 сек.
-
вот как можно быстро "положить" кликермана, немного ускорил процесс
$substr = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" // берем ровно 100 байт
$str = ""
FOR($a=0,$a<100) //100 раз по 100 байт = 10кб
$str = STRCONCAT($str,$substr)
print($a*100)
END_CYC
print(STRLEN ($str))
wait(1)
$substr = $str
FOR($a,$a<500000)
$str = STRCONCAT($str,$substr)
print(STRLEN ($str)) // и ровно на 1,020,000 символах = конец
waitms(20)
END_CYC
// и ровно на 1,020,000 символах = конец
а если быть точнее :D то 1,027,878 [spoiler]$substr = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
$str = ""
FOR($a=0,$a<100)
$str = STRCONCAT($str,$substr)
print($a*100)
END_CYC
print(STRLEN ($str))
$substr = $str
FOR($a=0,$a<101)
$str = STRCONCAT($str,$substr)
print(STRLEN ($str))
waitms(20)
END_CYC
$substr = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
FOR($a=0,$a<77)
$str = STRCONCAT($str,$substr)
print(STRLEN ($str))
waitms(20)
END_CYC
$substr = "1234567890"
FOR($a=0,$a<16)
$str = STRCONCAT($str,$substr)
print(STRLEN ($str))
waitms(20)
END_CYC
$substr = "1"
FOR($a=0,$a<160)
$str = STRCONCAT($str,$substr)
print(STRLEN ($str))
waitms(20)
END_CYC
[/spoiler]
-
Ну вот, у меня в текстовике как раз 1 027 708 символов. Пока сделал на скорую руку проверку по двум файлам. Радует, что оператива перестала тратиться совсем, 1% за ночь и все, когда как с одним большим файлом за ночь она использовалась до того, что все зависало. Теперь однозначно ясно, что это из-за текстовика было, а точнее из-за записи в него. Наверное при каждой записи в него строка копируется и остается в памяти программы, а за ночь это происходит тысячи раз. Как будет время и возможность буду тестировать вариант, который здесь предложили с несколькими строками в одном файле.