Author Topic: Из-за чего лагает скрипт?  (Read 2892 times)

0 Members and 1 Guest are viewing this topic.

komandirbk

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Из-за чего лагает скрипт?
« on: November 02, 2022, 07:34:47 AM »
Здравствуйте, выкладываю сюда код. Проблема в том, что спустя определенное время работы - невозможно остановить скрипт, он не реагирует на бинды, в трее тоже не останавливается вплоть до нескольких минут. Что нужно поменять?

Code: [Select]
$rnd1_x = 960
$rnd1_y = 441
$rnd2_x = 1043
$rnd2_y = 447
$rnd3_x = 1071
$rnd3_y = 501
$rnd4_x = 1026
$rnd4_y = 546
$rnd5_x = 961
$rnd5_y = 573
$rnd6_x = 886
$rnd6_y = 563
$rnd7_x = 864
$rnd7_y = 510
$rnd8_x = 959
$rnd8_y = 543
 
$rnd = RNDFROM($rnd1,$rnd2,$rnd3,$rnd4,$rnd5,$rnd6,$rnd7,$rnd8)
//$rnd_x = RNDFROM(829,1085,957,1030,900,1007,906,1092,1076)
//$rnd_y = RNDFROM(533,424,503,566,411,610)
$rnd_wait = RND(2000,5000)


THREAD(found, 1)
   
   IF($first = 0)
      $first = 1
      $g = hget(868,  296)


hsettext($g, "MU_QUEST")

      $quest = inputbox("Какого монстра ищем?", ".bmp", 500)
      LOGWRITE($quest)
     
      $exit = dialogbox("Закрыть окно по завершению квеста?", 4)
     
      if ($exit = 6)
         print("Да")
         $close = 1
      else
         print("Нет")
         $close = 0
      end_if
     
      waitms(300)
      WNDBUMP ($g)
      SETTHREAD (move, 1)
   END_IF
   
   
   $check = 0
   WHILE($check = 0)
      GETSCREEN(547,270, 1354,791)
      COLORMODE(8)
      IF_PICTURE_IN (547,270, 1354,791, $quest, -1, 99)
         SETTHREAD (move, 0)
         LUP($_xmouse, $_ymouse)
         waitms(200)
         //  $check = 1
         MOVE($_return1+30, $_return2+100)
         WAITMS(500)
         LDOWN($_return1+30, $_return2+100)
         waitms(500)
         LUP($_return1+30, $_return2+100)
         wait(1)
         KEYPRESS(#F6)
         wait(3)
         
         KEYPRESS(#F8)
         waitms(500)
         
     
     
      GETSCREEN(548,646, 876,780)
      COLORMODE(7)
      IF_PICTURE_IN (548,646, 876,780, "quest_done.bmp", -1, 90)
         
       IF($close = 1 )
            waitms(1000)
            MOVE(1337,236)
            waitms(300)
           LCLICK(1337,236)
            LOGWRITE("Окно закрыто")
            EXECUTE("CMH.exe", "TMessage Квест успешно выполнен! Окно закрыто")
            wait(1)
            halt
           
         ELSE
           
            EXECUTE("CMH.exe", "TMessage Квест успешно выполнен! Окно на месте ")
            halt


END_IF
     
     
   ELSE
   
      WAITMS(1000)
      SETTHREAD (move, 1)
   END_IF
   END_IF
END_CYC

END_THREAD





THREAD(move, 0)
waitms(100)
//MOVE($rnd_x, $rnd_y)
MOVE(RNDFROM($rnd1_x,$rnd2_x,$rnd3_x,$rnd4_x,$rnd5_x,$rnd6_x,$rnd7_x,$rnd8_x), RNDFROM($rnd1_y,$rnd2_y,$rnd3_y,$rnd4_y,$rnd5_y,$rnd6_y,$rnd7_y,$rnd8_y))
waitms(500)
LDOWN($_xmouse, $_ymouse)
waitms($rnd_wait)
LUP($_xmouse, $_ymouse)
wait(1)




END_THREAD

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Из-за чего лагает скрипт?
« Reply #1 on: November 02, 2022, 09:45:02 AM »
Во первых, здесь не 2, а 3 потока. Код в корне, это основной поток, он тоже крутится по кругу. А он состоит из бесконечного присваивания значений переменных.
В нём или должна быть задержка или т.к. он не имеет смысла и только вреден, поток found убрать пусть код будет в основной части кода. Всё равно там бесконечный цикл.

Во вторых, тот бесконечный цикл в found, если картинки нет, он без задержек будет по кругу гонять GETSCREEN-COLORMODE-IF_PICTURE_IN при этом ядро проца загрузится полностью.
Нужно добавить ELSE с задержкой или задержку в конце цикла WHILE

P.S. и не нужно начиловать интерпритатор и задавать имена совпадающие с встроенными функциями. Имя потока 'move' лучше поменять.

Code: (clickermann) [Select]
$rnd1_x = 960
$rnd1_y = 441
$rnd2_x = 1043
$rnd2_y = 447
$rnd3_x = 1071
$rnd3_y = 501
$rnd4_x = 1026
$rnd4_y = 546
$rnd5_x = 961
$rnd5_y = 573
$rnd6_x = 886
$rnd6_y = 563
$rnd7_x = 864
$rnd7_y = 510
$rnd8_x = 959
$rnd8_y = 543

$rnd = RNDFROM($rnd1,$rnd2,$rnd3,$rnd4,$rnd5,$rnd6,$rnd7,$rnd8)
//$rnd_x = RNDFROM(829,1085,957,1030,900,1007,906,1092,1076)
//$rnd_y = RNDFROM(533,424,503,566,411,610)
$rnd_wait = RND(2000,5000)


IF($first = 0)
    $first = 1
    $g = HGET(868, 296)
    HSETTEXT($g, "MU_QUEST")
   
    $quest = INPUTBOX("Какого монстра ищем?", ".bmp", 500)
    LOGWRITE($quest)
   
    $exit = DIALOGBOX("Закрыть окно по завершению квеста?", 4)
   
    IF ($exit = 6)
        print("Да")
        $close = 1
    ELSE
        print("Нет")
        $close = 0
    END_IF
   
    WAITMS(300)
    WNDBUMP($g)
    SETTHREAD(move_rnd, 1)
END_IF

$check = 0
WHILE($check = 0)
    GETSCREEN(547,270, 1354,791)
    COLORMODE(8)
    IF_PICTURE_IN(547,270, 1354,791, $quest, -1, 99)
        SETTHREAD(move, 0)
        LUP($_xmouse, $_ymouse)
        WAITMS(200)
        //  $check = 1
        MOVE($_return1+30, $_return2+100)
        WAITMS(500)
        LDOWN($_return1+30, $_return2+100)
        WAITMS(500)
        LUP($_return1+30, $_return2+100)
        WAIT(1)
        KEYPRESS(#F6)
        WAIT(3)
       
        KEYPRESS(#F8)
        WAITMS(500)
       
        GETSCREEN(548,646, 876,780)
        COLORMODE(7)
        IF_PICTURE_IN (548,646, 876,780, "quest_done.bmp", -1, 90)
            IF($close = 1 )
                WAITMS(1000)
                MOVE(1337,236)
                WAITMS(300)
                LCLICK(1337,236)
                LOGWRITE("Окно закрыто")
                EXECUTE("CMH.exe", "TMessage Квест успешно выполнен! Окно закрыто")
                WAIT(1)
                HALT
            ELSE
                EXECUTE("CMH.exe", "TMessage Квест успешно выполнен! Окно на месте ")
                HALT
            END_IF
        ELSE
            WAITMS(1000)
            SETTHREAD(move_rnd, 1)
        END_IF
    ELSE
        WAITMS(100)
    END_IF
END_CYC


THREAD(move_rnd, 0)
    WAITMS(100)
    //MOVE($rnd_x, $rnd_y)
    MOVE(RNDFROM($rnd1_x,$rnd2_x,$rnd3_x,$rnd4_x,$rnd5_x,$rnd6_x,$rnd7_x,$rnd8_x), RNDFROM($rnd1_y,$rnd2_y,$rnd3_y,$rnd4_y,$rnd5_y,$rnd6_y,$rnd7_y,$rnd8_y))
    WAITMS(500)
    LDOWN($_xmouse, $_ymouse)
    WAITMS($rnd_wait)
    LUP($_xmouse, $_ymouse)
    WAIT(1)
END_THREAD
« Last Edit: November 02, 2022, 09:52:34 AM by Vint »


kiril

  • Активный участник
  • ***
  • Posts: 106
    • View Profile
Re: Из-за чего лагает скрипт?
« Reply #2 on: November 03, 2022, 09:46:52 AM »

 Главные задержки возникают при работе цикла в этом месте
    GETSCREEN(548,646, 876,780)
        COLORMODE(7)
        IF_PICTURE_IN (548,646, 876,780, "quest_done.bmp", -1, 90)
            IF($close = 1 )

1. в одном цикле дважды обновляется графический буфер и дважды выполняется цветокоррекция, а можно сделать единый уровень цветокоррекции для всех картинок и обновлять одну общую область один раз  это заметно быстрее.
2. 90 % совпадения, да ещё если картинка не маленькая  это заведомо очень долгий поиск. лучше подготавливайте картинки, чтоб они находились ближе к  100%
3. условие  IF($close = 1 ) ни когда не сработает, пока строка //  $check = 1 превращена в комментарий

Code: (clickermann) [Select]
IF($var777 = 0)  // условие сработает один раз
$rnd1_x = 960
$rnd1_y = 441
$rnd2_x = 1043
$rnd2_y = 447
$rnd3_x = 1071
$rnd3_y = 501
$rnd4_x = 1026
$rnd4_y = 546
$rnd5_x = 961
$rnd5_y = 573
$rnd6_x = 886
$rnd6_y = 563
$rnd7_x = 864
$rnd7_y = 510
$rnd8_x = 959
$rnd8_y = 543
 
$rnd = RNDFROM($rnd1,$rnd2,$rnd3,$rnd4,$rnd5,$rnd6,$rnd7,$rnd8)  //переменная $rnd ни где не используется, у переменных типа  $rnd1 все значения нулевые
//$rnd_x = RNDFROM(829,1085,957,1030,900,1007,906,1092,1076)
//$rnd_y = RNDFROM(533,424,503,566,411,610)
$rnd_wait = RND(2000,5000)

END_IF
 
IF($first = 0)
    $first = 1
    $g = HGET(868, 296)
    HSETTEXT($g, "MU_QUEST")
 
    $quest = INPUTBOX("Какого монстра ищем?", ".bmp", 500)
    LOGWRITE($quest)
 
    $exit = DIALOGBOX("Закрыть окно по завершению квеста?", 4)
 
    IF ($exit = 6)
        print("Да")
        $close = 1
    ELSE
        print("Нет")
        $close = 0
    END_IF
 
    WAITMS(300)
    WNDBUMP($g)
    SETTHREAD(move_rnd, 1)
END_IF
 
$check = 0
WHILE($check = 0)
    GETSCREEN(547,270, 1354,791)
    COLORMODE(8)
    IF_PICTURE_IN(547,270, 1354,791, $quest, -1, 99)
        SETTHREAD(move_rnd, 0)    // изменено название потока
        LUP($_xmouse, $_ymouse)
        WAITMS(200)
         $check = 1   // коммент не давал выхода из цикла !!!
        MOVE($_return1+30, $_return2+100)
        WAITMS(500)
        LDOWN($_return1+30, $_return2+100)
        WAITMS(500)
        LUP($_return1+30, $_return2+100)
        WAIT(1)
        KEYPRESS(#F6)
        WAIT(3)
 
        KEYPRESS(#F8)
        WAITMS(500)
 
        GETSCREEN(548,646, 876,780)
        COLORMODE(7)
        IF_PICTURE_IN (548,646, 876,780, "quest_done.bmp", -1, 90)
            IF($close = 1 )
                WAITMS(1000)
                MOVE(1337,236)
                WAITMS(300)
                LCLICK(1337,236)
                LOGWRITE("Окно закрыто")
                EXECUTE("CMH.exe", "TMessage Квест успешно выполнен! Окно закрыто")
                WAIT(1)
                HALT
            ELSE
                EXECUTE("CMH.exe", "TMessage Квест успешно выполнен! Окно на месте ")
                HALT
            END_IF
        ELSE
            WAITMS(1000)
            SETTHREAD(move_rnd, 1)
        END_IF
    ELSE
        WAITMS(100)
    END_IF
END_CYC
 
 
THREAD(move_rnd, 0)
    WAITMS(100)
    //MOVE($rnd_x, $rnd_y)
    MOVE(RNDFROM($rnd1_x,$rnd2_x,$rnd3_x,$rnd4_x,$rnd5_x,$rnd6_x,$rnd7_x,$rnd8_x), RNDFROM($rnd1_y,$rnd2_y,$rnd3_y,$rnd4_y,$rnd5_y,$rnd6_y,$rnd7_y,$rnd8_y))
    WAITMS(500)
    LDOWN($_xmouse, $_ymouse)
    WAITMS($rnd_wait)
    LUP($_xmouse, $_ymouse)
    WAIT(1)
END_THREAD