Author Topic: Прекращается работа.  (Read 4562 times)

0 Members and 1 Guest are viewing this topic.

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Прекращается работа.
« on: January 09, 2016, 12:25:51 AM »
Всем привет. Пользовался скриптом больше года, все работало отлично. Сегодня случилась неприятность. Во время работы кликер стал вырубаться и появляется окно с предупреждением windows "Прекращена работа программы  clickerman.exe".  Начал анализировать, что происходит. Оказывается кликер падает в той части скрипта, когда выполняется запись числа в текстовый файл "9999.txt".  Скрипт берет число из буфера и проверяет его наличие в этом файле, если оно там есть , то все в порядке, он работает дальше, а вот если его там нет, то кликер начинает его записывать и рушится. И я заметил такую особенность, что как раз сегодня размер файла "9999.txt" подошел к 1 мегабайту. Неужели ограничение в 1мб? Как тогда быть? Может как-то можно разделить его на несколько файлов, или сделать в одном несколько строк? Помогите пожалуйста, очень срочно нужно... Вот эта часть скрипта
Code: (clickermann) [Select]
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. сейчас проверил, действительно из-за длинны строки он вырубается. Чуть уменьшил её и все работает, сделал больше - кликер рушится.
« Last Edit: January 09, 2016, 01:17:08 AM by justitdo »

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Прекращается работа.
« Reply #1 on: January 09, 2016, 02:04:10 AM »
Так как я не особо разбираюсь во всяких переменных и прочем, но рабочий скрипт нужен мне очень срочно, решил добавить еще один текстовый файл путем вставки после ELSE такого же кода. Скрипт проверяет первый файл, если число из буфера в нем есть, то выполняет заданное действие, а если нет, то ищет его во втором файле и если его там нет - добавляет. Протестировал, вроде бы работает.
Code: [Select]
$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

Как такой вариант? Или можно что-то покультурнее придумать?
« Last Edit: January 09, 2016, 11:57:01 AM by justitdo »

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Прекращается работа.
« Reply #2 on: January 09, 2016, 11:56:17 AM »
Или может длина строки в текстовом файле ограничена этим размером? Кстати, я тут тему создавал, что кликер съедает всю оперативку, так вот сейчас эта проблема решилась. Значит забивала оперативку информация из текстового файла...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Прекращается работа.
« Reply #3 on: January 09, 2016, 04:42:58 PM »
А какая длинна строки? Для 32 битных систем максимальное число 2147483647. Может быть в этом дело.

Зачем писать в другой файл когда можно начать новую строку
Вот что получилось, но сам как это работает не проверял.
Code: (clickermann) [Select]
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, но у тебя там смотри сам что в скрипте
« Last Edit: January 09, 2016, 04:45:53 PM by Oraven »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Прекращается работа.
« Reply #4 on: January 09, 2016, 05:16:09 PM »
А какая длинна строки? Для 32 битных систем максимальное число 2147483647. Может быть в этом дело.

не, врядли изза этого. сам тестил

потом еще тесты, еще, кстати лучше использовать STRWRITELN ("file", "str", [rewrite]) чтоб при случае ошибки - файл не остался пустым.
в этоге пришел к выводу, что весь упор в STRCONCAT. он не может присоединить к мега строке еще чтото.
кстати отличное решение искать в отдной строке состоящей из тысяч подстрок, за счет этого скорость поиска - пару милисекунд (естественно при поиске  последнего слова в строке). если разделить мегобайтную строку на отдельные строки (тестил со строками 30символов, это 33к строк) то скорость поиска последней строки увеличивается до десятка минут. конечно можно переводить строки в массив, так быстрее, 10 сек.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Прекращается работа.
« Reply #5 on: January 10, 2016, 12:24:31 AM »
вот как можно быстро "положить" кликермана, немного ускорил процесс
Code: (clickermann) [Select]
$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



Quote
// и ровно на 1,020,000 символах = конец
а если быть точнее  :D то  1,027,878 [spoiler]
Code: (clickermann) [Select]
$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]
« Last Edit: January 10, 2016, 12:41:20 AM by dramster »

justitdo

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Прекращается работа.
« Reply #6 on: January 10, 2016, 10:58:55 AM »
Ну вот, у меня в текстовике как раз 1 027 708 символов. Пока сделал на скорую руку проверку по двум файлам.  Радует, что оператива перестала тратиться совсем, 1% за ночь  и все, когда как с одним большим файлом за ночь она использовалась до того, что все зависало. Теперь однозначно ясно, что это из-за текстовика было, а точнее из-за записи в него. Наверное при каждой записи в него строка копируется и остается в памяти программы, а за ночь это происходит тысячи раз. Как будет время и возможность буду тестировать вариант, который здесь предложили с несколькими строками в одном файле.