Примечание: проблема с delay
была исправлена в OS X 10.11 El Capitan.
С тех пор как я перешел на Yosemite, приложения, использующие задержки, перестали работать. Как я могу это исправить?
Вот самый простой в мире Applescript, для простого примера:
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
delay 5
set volume output volume 20
delay 5
set volume output volume 0
Это должно занять 30 секунд, чтобы завершить. Если я запускаю его в Script Editor (ранее Applescript Editor), это займет 30 секунд. Но если я сохраню этот сценарий как приложение, при запуске приложения задержки будут проигнорированы, и приложение завершится за долю секунды.
Как я могу заставить Applescript отложить на указанное количество времени, прежде чем перейти к следующему шагу? Это глюк Йосемити? Есть ли надежный обходной путь?
yosemite
applescript
2oh1
источник
источник
Ответы:
Примечание: проблема с
delay
была исправлена в OS X 10.11 El Capitan.@ 2oh1, у вас есть правильная основная идея в вашем ответе, но вот полный и правильный ответ:
Единственный разумный способ обойти это состоит в том, чтобы вызвать «задержку» в цикле, которая обеспечивает желаемую продолжительность, прежде чем продолжить. Лучший способ сделать это - переопределить «задержку» с помощью специального обработчика:
Это позволяет вам оставить остальную часть вашего сценария без изменений, и вы можете использовать «задержку» как обычно, например,
[ПРИМЕЧАНИЕ. Обычно пользовательский обработчик использует «длительность задержки продолжения» для вызова встроенной «задержки», но я обнаружил, что, хотя это работает в редакторе сценариев, он возвращает ошибку при использовании в апплете («Can»). t продолжить задержку. (-1708) »). Я обошел эту проблему, напрямую попросив AppleScript обработать команду задержки, вместо того чтобы использовать «продолжить».]
Проблема заключается в том, что
delay
пользовательский ввод обрабатывается во время паузы сценария, поэтому вы все равно можете щелкать по меню или окнам, отображаемым апплетом, и существует ошибка (исправлена в 10.11), когда пользовательский ввод не вызываетdelay
полной продолжительности, прежде чем возобновить выполнение сценария. , Если вы не взаимодействуете с апплетом,delay
работает правильно.источник
Когда я боролся с этой же проблемой, я наткнулся на этот ответ на не очень связанный вопрос и решил попробовать его, и, похоже, он мне подходит.
Просто замените
delay 5
наdo shell script "/bin/sleep 5"
и получите тот же результат.источник
/bin/sleep
ожидает продолжительность сна и не возвращается, пока не завершится. Напротив, встроеннаяdelay
команда AppleScript обрабатывает события пользовательского ввода, пока скрипт находится в режиме паузы. (Именно в этом и заключается ошибка: если есть ввод с клавиатуры пользователя,delay
выполнение скрипта продолжается до того, как истечет время задержки.)Я не говорю, что это лучшее решение, но, похоже, оно решило мою проблему. Вместо того, чтобы использовать простую задержку, которая игнорируется по причинам, которые я не понимаю, я переключился на получение времени и цикл до достижения нового времени (он все еще использует задержку, но не имеет значения, игнорирует ли он задержка, так как сценарий не продолжается, пока не будет достигнуто время).
Я все еще хочу знать, почему задержка игнорируется (или резко ускоряется?! ??), но это делает работу, неуклюжей.
источник
delay
будет продолжать прерываться, пока что-то не обработает события и не удалит их из очереди.Я нашел обходной путь в немецком сообщении на форуме . Добавьте эти строки в начало вашего скрипта:
источник
delay
обрабатывает пользовательский ввод, пока скрипт находится в режиме паузы, поэтому вы можете, например, взаимодействовать с меню и окнами.у carzyj было то, что я считаю лучшим ответом, но в сочетании с методом Криса Пейджа вы получаете:
Вы можете закомментировать «задержка» через «окончание задержки», чтобы вернуться к первоначальной задержке.
источник
это модификация решения @ chris-page
Кажется, что существует баланс между отзывчивостью и точным фиксированием задержки.
Но вместо того, чтобы сказать Applescript о задержке на общую продолжительность, мы просто скажем ему отложить на дробный период продолжительности. если период меньше, чем позволяет яблоко (1/60 секунды), тогда давайте просто установим его на эту дельту. Что мы можем сохранять некоторую отзывчивость, но все же быть точными. есть подозрение, что иногда задержка не работает, поэтому цикл повтора пока удерживает поток заблокированным, но в сценариях успеха мы хотим, чтобы дельта задержки была короткой, чтобы процесс все еще мог быть прерван
источник
delay
задержать столько, сколько возможно, прежде чем продолжить выполнение.delay endTime - (current date)
вместо негоdelay duration
, что гарантирует, что еслиdelay
его не прервать, он не остановит сценарий дольше, чем первоначально запрошенное время, что, возможно, и было тем, что вы пытались обратитесь с этим ответом.Итак, чтобы сложить все вместе, я считаю, что Крис означает это:
источник