Author Topic: Повторное нажатие кнопки отменяет цикл  (Read 3537 times)

0 Members and 1 Guest are viewing this topic.

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Всем привет. Не могу сообразить как интегрировать схему вкл./выкл. Первое нажатие кнопки для запуска цикла, а второе для его остановки. Первая часть худо-бедно работает  :D
Quote
IF (ISKEYDOWN(#p)=1)
start:
waitms(rnd(1711,2102))
  keyDown(#v)
waitms(rnd(73,121))
  keyUp(#v)
  END_IF
  GOTO (start)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #1 on: September 20, 2017, 04:17:16 PM »
Как то так
Code: (clickermann) [Select]
// поток с кликами
THREAD(cl, 0)
    keyDown(#v)
    waitms(rnd(73, 121))
    keyUp(#v)
    waitms(rnd(1711, 2102))
END_THREAD

// переключатель
IF(ISKEYDOWN(#p) = 1)
    $run = $run ^ 1
    IF($run = 0)
        SETTHREAD(cl, 2)
        waitms(20)
        IF(ISKEYDOWN(#v) = 1)
            keyUp(#v)
        END_IF
    ELSE
        SETTHREAD(cl, 1)
    END_IF
    WHILE(ISKEYDOWN(#p) = 1)
        waitms(20)
    END_CYC
END_IF
waitms(30)


ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #2 on: September 20, 2017, 05:35:34 PM »
полет нормальный. следующий этап для меня, это добавить схожий сценарий на другую кнопку, в принципе могу использовать как шаблон? или нужны будут иные переменные?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #3 on: September 20, 2017, 08:58:12 PM »
Переменные другие $run и другое имя потока. Всё.


ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #4 on: September 20, 2017, 11:10:19 PM »
спасибо! :)

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #5 on: September 21, 2017, 11:19:46 AM »
Можете смеяться, а можете поплакать, я тут сел немножечко покакать :D
Переменные и имя потока видимо иначе пишутся)
Code: (clickermann) [Select]
// поток 1
THREAD(cl, 0)
    keyDown(#v)
    waitms(rnd(73, 121))
    keyUp(#v)
    waitms(rnd(1711, 2102))
END_THREAD
 
// переключптель 1
IF(ISKEYDOWN(#p) = 1)
    $run = $run ^ 1
    IF($run = 0)
        SETTHREAD(cl, 2)
        waitms(20)
        IF(ISKEYDOWN(#v) = 1)
            keyUp(#v)
        END_IF
    ELSE
        SETTHREAD(cl, 1)
    END_IF
    WHILE(ISKEYDOWN(#p) = 1)
        waitms(20)
    END_CYC
END_IF
waitms(30)
////////////////////////////////////////////////////////////////////////
// поток 2
THREAD(cl, 3)
waitms(rnd(262,373))
  keyDown(#d)
waitms(rnd(262,373))
move(1027,73)
waitms(rnd(262,373))
DBLCLICK(1027,73)
waitms(rnd(262,373))
  keyUp(#d)
waitms(rnd(4325,5046))
END_THREAD
 
// переключатель 2
IF(ISKEYDOWN(#o) = 1)
    $run = $run ^ 4
    IF($run = 3)
        SETTHREAD(cl, 5)
        waitms(20)
        IF(ISKEYDOWN(#o) = 1)
            keyUp(#o)
        END_IF
    ELSE
        SETTHREAD(cl, 4)
    END_IF
    WHILE(ISKEYDOWN(#o) = 1)
        waitms(20)
    END_CYC
END_IF
waitms(30)

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #6 on: September 21, 2017, 01:07:03 PM »
Переменные и имя потока видимо иначе пишутся)
да, ты прав, там у тебя полная ерунда.

давай я тебе прокоментирую скрипт vinta, и далее ты сам попробуешь написать заново.


Code: (clickermann) [Select]
// поток с кликами
THREAD(cl, 0)    //имя потока "cl". 0 - это  начальное состояние, где 1 - означает рабочее, 0 - приостановленное; необязательный параметр, значение по умолчанию - 1

//твои действия во время работы потока
    keyDown(#v)
    waitms(rnd(73, 121))
    keyUp(#v)
    waitms(rnd(1711, 2102))
END_THREAD
 
// переключатель
IF(ISKEYDOWN(#p) = 1)  //условие, проверяет нажата ли кнопка. в этом случае P . если зажато, то начинаем делать то , что внутри условия. иначе пропускаем его.
    $run = $run ^ 1   //переключатель. при каждом последующем проходе, переменная $run будет менять значение. чередовать то 0, то 1, опять 0, и так далее. как работает этот значек ^, тебе знать пока не обязательно.
    IF($run = 0)   //если при нажатии на P переменная $run переключиться на значение 0, то сработает условие.
        SETTHREAD(cl, 2)     // ставим поток на паузу, вернее стоп. 2 - поток ставится на паузу, при этом при повторной его активации он начинает выполняться с начала, независимо от того, на каком этапе он был остановлен
 
        waitms(20)
        IF(ISKEYDOWN(#v) = 1)   //если в работающем потоке вдруг в этот момент зажата кнопка V, то отпускаем ее.
            keyUp(#v)
        END_IF
    ELSE             //если  $run = 1
        SETTHREAD(cl, 1)     //1 - поток продолжает выполнение с места, где был остановлен

    END_IF
    WHILE(ISKEYDOWN(#p) = 1)     //цикл ожидания, пока кнопка P зажата. ожидание пока ты ее не отпустишь. твое кратковременное нажатие на кнопку для кликера довольно долгое.
        waitms(20)
    END_CYC
END_IF
waitms(30)

но проще было посмотреть в справке. там все подробно и понятно расписано.





еще немножко интересного из справки:

THREAD (thread_name, [init_state]) ... END_THREAD - описывает дочерний поток

Параметры:
thread_name - имя потока, может быть любым.
init_state - начальное состояние, где 1 - означает рабочее, 0 - приостановленное; необязательный параметр, значение по умолчанию - 1

SetThread (thread_name, state) - меняет состояние дочернего потока

Параметры:
thread_name - имя потока
state - задаваемое состояние

Значения state:
0 - поток ставится на паузу
1 - поток продолжает выполнение с места, где был остановлен
2 - поток ставится на паузу, при этом при повторной его активации он начинает выполняться с начала, независимо от того, на каком этапе он был остановлен

ну и немного о переменных:[spoiler]Как вы знаете со школы, переменные это такие ячейки памяти, которые содержат какое либо значение, при этом оно может туда помещаться и оттуда извлекаться.
Данная программа так же поддерживает переменные. Они могут содержать в себе числа (целые и с точкой) и строки. Переменные могут участвовать в вычислениях, передаваться в качестве параметров для функций и процедур. Даже если у вас не было в школе информатики, из математики вы прекрасно научились обращаться с переменными.
Имена для переменных могут содержать буквы латинского алфавита, цифры и знак "_" (нижнее подчеркивание). При этом перед именем обязательно должен идти префикс "$", а само имя не должно начинаться с цифры. К примеру, "$my_var1" - вполне допустимое имя для переменной.
Использование переменных предельно простое. Вы просто вместо числовой константы (числа) подставляете переменную. То есть если было "lclick(10, 10)", то станет "lclick(10, $var)". [/spoiler]
« Last Edit: September 21, 2017, 01:20:45 PM by dramster »

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #7 on: September 21, 2017, 01:22:17 PM »
за комментарии отдельное спасибо! я как падаван пытаюсь обуздать этот язык, даже мультиязык :D

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #8 on: September 21, 2017, 02:25:49 PM »
сменил имена и этого как оказалось достаточно. конфликтов не обнаружено.
Code: (clickermann) [Select]
// поток 1
THREAD(cl, 0)
    keyDown(#v)
    waitms(rnd(73, 121))
    keyUp(#v)
    waitms(rnd(1711, 2102))
END_THREAD
 
// переключптель 1
IF(ISKEYDOWN(#p) = 1)
    $run = $run ^ 1
    IF($run = 0)
        SETTHREAD(cl, 2)
        waitms(20)
        IF(ISKEYDOWN(#v) = 1)
            keyUp(#v)
        END_IF
    ELSE
        SETTHREAD(cl, 1)
    END_IF
    WHILE(ISKEYDOWN(#p) = 1)
        waitms(20)
    END_CYC
END_IF
waitms(30)
////////////////////////////////////////////////////////////////////////
// поток 2
THREAD(cll, 0)
waitms(rnd(262,373))
  keyDown(#d)
waitms(rnd(262,373))
move(1027,73)
waitms(rnd(262,373))
DBLCLICK(1027,73)
waitms(rnd(262,373))
  keyUp(#d)
waitms(rnd(4325,5046))
END_THREAD
 
// переключатель 2
IF(ISKEYDOWN(#o) = 1)
    $run = $run ^ 1
    IF($run = 0)
        SETTHREAD(cll,2)
        waitms(20)
        IF(ISKEYDOWN(#o) = 1)
            keyUp(#o)
        END_IF
    ELSE
        SETTHREAD(cll, 1)
    END_IF
    WHILE(ISKEYDOWN(#o) = 1)
        waitms(20)
    END_CYC
END_IF
waitms(30)

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #9 on: September 21, 2017, 03:16:52 PM »
есть недочеты.

1. ты несовсем понял смысл отпускания кнопки, которая может остаться зажатой в потоке.

Code: (clickermann) [Select]
IF(ISKEYDOWN(#o) = 1)
    $run = $run ^ 1
    IF($run = 0)
        SETTHREAD(cll,2)
        waitms(20)
        IF(ISKEYDOWN(#D) = 1) // отпускаем ту кнопку, которая может остаться зажатой в потоке после его остоновки.
            keyUp(#D)
        END_IF
    ELSE
        SETTHREAD(cll, 1)
    END_IF
    WHILE(ISKEYDOWN(#o) = 1)
        waitms(20)
    END_CYC
END_IF

2. в твоем варианте неразбериха с переключением потоков изза одинаковой переменной в переключателях $run. у тебя работает как то так - к примеру включаешь первый поток, если его не выключить, и попытаться включить второй, то он с первого раза не сработает, только со второго. примерно тоже будет  в обратном порядке .... кароче фигня будет непонятная.

независимое переключение потоков:
Code: (clickermann) [Select]
// переключатель 1
IF(ISKEYDOWN(#p) = 1)
    $run_1 = $run_1 ^ 1
    IF($run_1 = 0)
        SETTHREAD(cl, 2)
        waitms(20)
        IF(ISKEYDOWN(#v) = 1)
            keyUp(#v)
        END_IF
    ELSE
        SETTHREAD(cl, 1)
    END_IF
    WHILE(ISKEYDOWN(#p) = 1)
        waitms(20)
    END_CYC
END_IF

// переключатель 2
IF(ISKEYDOWN(#o) = 1)
    $run_2 = $run_2 ^ 1
    IF($run_2 = 0)
        SETTHREAD(cll,2)
        waitms(20)
        IF(ISKEYDOWN(#d) = 1)
            keyUp(#d)
        END_IF
    ELSE
        SETTHREAD(cll, 1)
    END_IF
    WHILE(ISKEYDOWN(#o) = 1)
        waitms(20)
    END_CYC
END_IF
waitms(30)

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Повторное нажатие кнопки отменяет цикл
« Reply #10 on: September 21, 2017, 03:34:04 PM »
признаю, не понимаю пока смысла отпускания кнопки. а включение двух потоков одновременно в планах не было, но в очередной раз благодарю. в принципе интуитивно думал об этом, когда Vint давал вектор.
« Last Edit: September 21, 2017, 03:40:12 PM by ZMAN »