Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: АНТИКЛАН on December 30, 2016, 08:22:35 PM

Title: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: АНТИКЛАН on December 30, 2016, 08:22:35 PM
Code: (clickermann) [Select]
IF($TIME < $_time_t)
   $TIME = $_time_t + 1
   LOGWRITE($CYCLE_STATE)
END_IF
IF(iskeydown(#A)=1)
   $CYCLE_STATE = 0
   WHILE($CYCLE_STATE = 0)
      IF(iskeydown(#A)=1)
         $CYCLE_STATE = 1
      END_IF
      WAITMS(10)
   END_CYC
END_IF

Вроде по нажатию клавиши A запись в лог должна останавливаться, а продолжаться при повторном нажатии, но почему-то не работает. Вроде как из-за того что даже без повторного нажатия переменная сбрасывается на единицу. Вроде все правильно написано. Проверьте у себя пожалуйста.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: lokipall on December 30, 2016, 09:43:04 PM
добавь цикл задерживающий выполнение, пока клавиша не будет отпущена.
а тепрь для совсем глупых
Code: (clickermann) [Select]
IF($TIME < $_time_t)
   $TIME = $_time_t + 1
   LOGWRITE($CYCLE_STATE)
END_IF
IF(iskeydown(#A)=1)
WHILE(iskeydown(#A)=1)
  WAITMS(20)
END_CYC
   $CYCLE_STATE = 0
   WHILE($CYCLE_STATE = 0)
      IF(iskeydown(#A)=1)
  WHILE(iskeydown(#A)=1)
  WAITMS(20)
END_CYC
         $CYCLE_STATE = 1
      END_IF
      WAITMS(10)
   END_CYC
END_IF
(я просто из любопытства решил посмотреть, задача не моя я ее не совсем понимаю)
вставил вроде цикл задержку, запись паузит вроде работает, но при старте, до первого нажатия #A он пишит 0 значение тоесть вроде ноль но в цикл WHILE($CYCLE_STATE = 0) не попадает.
это типо отсутствие самой переменной так проявляется? в логах ноль а в цикле не ноль?
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: Oraven on December 30, 2016, 09:54:57 PM
Code: (clickermann) [Select]
IF($TIME < $_time_t)
   $TIME = $_time_t + 1
   LOGWRITE($CYCLE_STATE)
END_IF

IF(ISKEYDOWN(#A)=1)
   WHILE(ISKEYDOWN(#A)=1)
      WAITMS(20)
   END_CYC
   WHILE(ISKEYDOWN(#A)=0)
      WAITMS(20)
   END_CYC
   WHILE(ISKEYDOWN(#A)=1)
      WAITMS(20)
   END_CYC
END_IF
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: АНТИКЛАН on December 30, 2016, 10:01:39 PM
Code: (clickermann) [Select]
IF($TIME < $_time_t)
   $TIME = $_time_t + 1
   LOGWRITE($CYCLE_STATE)
END_IF

IF(ISKEYDOWN(#A)=1)
   WHILE(ISKEYDOWN(#A)=1)
      WAITMS(20)
   END_CYC
   WHILE(ISKEYDOWN(#A)=0)
      WAITMS(20)
   END_CYC
   WHILE(ISKEYDOWN(#A)=1)
      WAITMS(20)
   END_CYC
END_IF

Вы немного не поняли мне нужна пауза не на время удержания клавиши, а просто кнопка вкл/выкл. И я вообще что-то не пойму логику вашего кода из трёх вайлов...
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: Oraven on December 31, 2016, 08:05:51 AM
Вы немного не поняли мне нужна пауза не на время удержания клавиши, а просто кнопка вкл/выкл. И я вообще что-то не пойму логику вашего кода из трёх вайлов...

Это работает так как ты шочешь. Запускаешь, логирует. Нажимаешь А, не логирует, снова нажимаешь, логирует.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: АНТИКЛАН on December 31, 2016, 07:27:16 PM
Это работает так как ты шочешь. Запускаешь, логирует. Нажимаешь А, не логирует, снова нажимаешь, логирует.

А можно поподробней? Интересно разобраться.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: Oraven on December 31, 2016, 10:34:53 PM
Вообще если тебе нужен переключатель то нужно использовать поток

$t1 = $t1^1 это битовая операция. Присваивает переменной $t1 либо 1 либо 0 в зависимости что там находится.

Code: (clickermann) [Select]
LOGWRITE($CYCLE_STATE)
WAIT(1)


THREAD(key,1) // поток переключателя
   IF(ISKEYDOWN(#A)=1)
      WHILE(ISKEYDOWN(#A)=1)
         WAITMS(20)
      END_CYC
      IF($t1 = 0)
         $t1 = $t1^1
         // включение
         $CYCLE_STATE = 1
      ELSE
         $t1 = $t1^1
         // выключение
         $CYCLE_STATE = 0
      END_IF
      WAITMS(20)
   ELSE
      WAITMS(20)
   END_IF
END_THREAD
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: Vint on January 01, 2017, 10:43:21 PM
А нафига там $t1 ?
$CYCLE_STATE и есть переключатель. И IF с ELSE не нужен.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: АНТИКЛАН on January 02, 2017, 12:08:41 AM
Вообще если тебе нужен переключатель то нужно использовать поток

$t1 = $t1^1 это битовая операция. Присваивает переменной $t1 либо 1 либо 0 в зависимости что там находится.

Code: (clickermann) [Select]
LOGWRITE($CYCLE_STATE)
WAIT(1)


THREAD(key,1) // поток переключателя
   IF(ISKEYDOWN(#A)=1)
      WHILE(ISKEYDOWN(#A)=1)
         WAITMS(20)
      END_CYC
      IF($t1 = 0)
         $t1 = $t1^1
         // включение
         $CYCLE_STATE = 1
      ELSE
         $t1 = $t1^1
         // выключение
         $CYCLE_STATE = 0
      END_IF
      WAITMS(20)
   ELSE
      WAITMS(20)
   END_IF
END_THREAD

Я так и не понял зачем цикл вайл "пока удерживается клавиша". Она не должна удерживаться. Она должна просто нажиматься и переключать значение переменной. И от этого процесс должен либо входить в цикл с ожиданием повторного нажатия либо проверять таймер и первое нажатие. У меня же в первом посте написан правильный код, который должен работать если его поместить в поток. Я насчет этого писал, что правильный код не работает.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: Oraven on January 02, 2017, 06:22:56 AM
За тем чтобы дело пошло только после отпускания клавиши.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: Vint on January 02, 2017, 04:38:55 PM
Я так и не понял зачем цикл вайл "пока удерживается клавиша". Она не должна удерживаться. Она должна просто нажиматься и переключать значение переменной. И от этого процесс должен либо входить в цикл с ожиданием повторного нажатия либо проверять таймер и первое нажатие. У меня же в первом посте написан правильный код, который должен работать если его поместить в поток. Я насчет этого писал, что правильный код не работает.
Что значит "не работает"? Работает, но так, как написан.
У тебя от строки 5 до 8 пройдёт максимум 1 мс. За это время ты отпустить клавишу не успеешь даже если будешь пол года тренироваться. Поэтому второе условие будет почти всегда успевать сработать с первым.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: АНТИКЛАН on January 02, 2017, 06:46:29 PM
Что значит "не работает"? Работает, но так, как написан.
У тебя от строки 5 до 8 пройдёт максимум 1 мс. За это время ты отпустить клавишу не успеешь даже если будешь пол года тренироваться. Поэтому второе условие будет почти всегда успевать сработать с первым.

То есть все таки я правильно думал что когда я нажимаю клавишу в первый раз у меня срабатывают все условия до второго нажатия включительно и переменная сразу же становится снова равной единице.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: Vint on January 02, 2017, 10:13:36 PM
Да. Поэтому и нужно сделать цикл с задержкой до отпускания клавиши. Чтоб срабатывание было чётким, одно нажатие - одно переключение.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: АНТИКЛАН on January 02, 2017, 10:22:49 PM
Да. Поэтому и нужно сделать цикл с задержкой до отпускания клавиши. Чтоб срабатывание было чётким, одно нажатие - одно переключение.

Понял. Делаю.
Title: Re: Не работает конструкция. Проверьте у себя пожалуйста.
Post by: АНТИКЛАН on January 03, 2017, 11:34:08 AM
Посидел. Подумал. И согласился. Решение о торможении потока через WHILE будет самым аккуратным и понятным на сегодняшний день. Спасибо всем кто участвовал в беседе. С вами я стал еще чуть опытнее. Беру эту фишку на вооружение. :)