Author Topic: Возможна ли одновременная работа ISKEYDOWN и WAIT?  (Read 1672 times)

0 Members and 1 Guest are viewing this topic.

123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
В скрипте есть долгое ожидание, которое должно быть строго определённое время, но иногда оно не нужно и хотелось бы сделать возможность нажатием клавиши во время этого ожидания завершать его досрочно, чтобы скрипт продолжал работу дальше. На ум приходит только слоёный пирог из этих 2 команд - их многократное чередование, сжатое с помощью цикла. Но тогда пострадает точность всего срока ожидания. Придётся регулировать его методом тыка. Оно может получаться разным на компах разной мощности или даже на одном и том же при разной загруженности.
Можно ли сделать как-то получше ожидание с возможностью прерывания? Существует ли возможность точной ориентации по времени скрипта, в котором смесь разных команд и ожиданий?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Только циклом можно проконтролировать нажатия клавиш

Code: (clickermann) [Select]
// вариант с циклом-задержкой
$ms = $_ms // засекаем время
$count  = 0
WHILE(($count < 10)&(iskeydown(#ctrl)=0)) // задержка на 10 секунд отменяемая Ctrlом
   INC($count,1)
   WAITMS(999)
END_CYC

LOGWRITE ("Прошло 1: ", $_ms-$ms)

// вариант с обычной задержкой
$ms = $_ms // засекаем время
WAIT(10)

LOGWRITE ("Прошло 2: ", $_ms-$ms)

HALT

Лог:
Code: [Select]
18:23:32 Прошло 1: 10003
18:23:42 Прошло 2: 10000
« Last Edit: September 23, 2014, 05:47:27 PM by Oraven »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Чтобы не накапливать ошибку WAIT не используй её для паузы в этом случае. Ориентируйся на системное время.
От "компов разной мощности или даже на одном и том же при разной загруженности" зависеть не будет.
Code: (clickermann) [Select]
$time = $_ms+600000  // 10 минут
WHILE(($time > $_ms)&(iskeydown(#ctrl)=0))
  WAITMS(20)
END_CYC