Author Topic: Не работает конструкция. Проверьте у себя пожалуйста.  (Read 4815 times)

0 Members and 1 Guest are viewing this topic.

АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
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 запись в лог должна останавливаться, а продолжаться при повторном нажатии, но почему-то не работает. Вроде как из-за того что даже без повторного нажатия переменная сбрасывается на единицу. Вроде все правильно написано. Проверьте у себя пожалуйста.

lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
добавь цикл задерживающий выполнение, пока клавиша не будет отпущена.
а тепрь для совсем глупых
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) не попадает.
это типо отсутствие самой переменной так проявляется? в логах ноль а в цикле не ноль?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
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

АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
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

Вы немного не поняли мне нужна пауза не на время удержания клавиши, а просто кнопка вкл/выкл. И я вообще что-то не пойму логику вашего кода из трёх вайлов...
« Last Edit: April 15, 2018, 06:54:03 PM by АНТИКЛАН »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Вы немного не поняли мне нужна пауза не на время удержания клавиши, а просто кнопка вкл/выкл. И я вообще что-то не пойму логику вашего кода из трёх вайлов...

Это работает так как ты шочешь. Запускаешь, логирует. Нажимаешь А, не логирует, снова нажимаешь, логирует.

АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
Это работает так как ты шочешь. Запускаешь, логирует. Нажимаешь А, не логирует, снова нажимаешь, логирует.

А можно поподробней? Интересно разобраться.
« Last Edit: April 15, 2018, 06:54:18 PM by АНТИКЛАН »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Вообще если тебе нужен переключатель то нужно использовать поток

$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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
А нафига там $t1 ?
$CYCLE_STATE и есть переключатель. И IF с ELSE не нужен.


АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
Вообще если тебе нужен переключатель то нужно использовать поток

$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

Я так и не понял зачем цикл вайл "пока удерживается клавиша". Она не должна удерживаться. Она должна просто нажиматься и переключать значение переменной. И от этого процесс должен либо входить в цикл с ожиданием повторного нажатия либо проверять таймер и первое нажатие. У меня же в первом посте написан правильный код, который должен работать если его поместить в поток. Я насчет этого писал, что правильный код не работает.
« Last Edit: April 15, 2018, 06:54:44 PM by АНТИКЛАН »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
За тем чтобы дело пошло только после отпускания клавиши.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Я так и не понял зачем цикл вайл "пока удерживается клавиша". Она не должна удерживаться. Она должна просто нажиматься и переключать значение переменной. И от этого процесс должен либо входить в цикл с ожиданием повторного нажатия либо проверять таймер и первое нажатие. У меня же в первом посте написан правильный код, который должен работать если его поместить в поток. Я насчет этого писал, что правильный код не работает.
Что значит "не работает"? Работает, но так, как написан.
У тебя от строки 5 до 8 пройдёт максимум 1 мс. За это время ты отпустить клавишу не успеешь даже если будешь пол года тренироваться. Поэтому второе условие будет почти всегда успевать сработать с первым.
« Last Edit: January 02, 2017, 04:41:20 PM by Vint »


АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
Что значит "не работает"? Работает, но так, как написан.
У тебя от строки 5 до 8 пройдёт максимум 1 мс. За это время ты отпустить клавишу не успеешь даже если будешь пол года тренироваться. Поэтому второе условие будет почти всегда успевать сработать с первым.

То есть все таки я правильно думал что когда я нажимаю клавишу в первый раз у меня срабатывают все условия до второго нажатия включительно и переменная сразу же становится снова равной единице.
« Last Edit: April 15, 2018, 06:54:57 PM by АНТИКЛАН »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Да. Поэтому и нужно сделать цикл с задержкой до отпускания клавиши. Чтоб срабатывание было чётким, одно нажатие - одно переключение.
« Last Edit: January 02, 2017, 10:15:21 PM by Vint »


АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
Да. Поэтому и нужно сделать цикл с задержкой до отпускания клавиши. Чтоб срабатывание было чётким, одно нажатие - одно переключение.

Понял. Делаю.
« Last Edit: April 15, 2018, 06:55:16 PM by АНТИКЛАН »

АНТИКЛАН

  • Активный участник
  • ***
  • Posts: 111
    • View Profile
Посидел. Подумал. И согласился. Решение о торможении потока через WHILE будет самым аккуратным и понятным на сегодняшний день. Спасибо всем кто участвовал в беседе. С вами я стал еще чуть опытнее. Беру эту фишку на вооружение. :)