참고 : 이 문제 delay
는 OS X 10.11 El Capitan에서 수정되었습니다.
Yosemite로 업그레이드 한 이후 지연을 사용하는 Applescript가 작동을 멈췄습니다. 이 문제를 어떻게 해결할 수 있습니까?
다음은 쉬운 예를 위해 세계에서 가장 간단한 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 초가 걸립니다. 스크립트 편집기 (이전의 Applescript 편집기)에서 실행하면 완료하는 데 30 초가 걸립니다. 그러나이 스크립트를 앱으로 저장하면 앱을 시작할 때 지연이 무시되고 앱이 완료되는 데 1 초가 걸립니다.
다음 단계로 넘어 가기 전에 Applescript가 지정된 시간 동안 지연되도록하려면 어떻게해야합니까? 이것은 요세미티 결함입니까? 신뢰할 수있는 해결 방법이 있습니까?
답변
참고 : 이 문제 delay
는 OS X 10.11 El Capitan에서 수정되었습니다.
@ 2oh1, 당신은 당신의 대답에 올바른 기본 아이디어를 가지고 있지만 다음은 완전하고 정확한 대답입니다.
이 문제를 해결하는 유일한 방법은 루프 내에서 “지연”을 호출하여 계속하기 전에 원하는 지속 시간이 경과되도록하는 것입니다. 이를 수행하는 가장 좋은 방법은 사용자 지정 처리기로 “지연”을 재정의하는 것입니다.
on delay duration
set endTime to (current date) + duration
repeat while (current date) is less than endTime
tell AppleScript to delay endTime - (current date)
end repeat
end delay
이렇게하면 나머지 스크립트를 변경하지 않고 “지연”을 정상적으로 사용할 수 있습니다.
delay 5
display alert "I like cake!"
[참고 : 일반적으로 사용자 정의 처리기는 “연속 지속 시간”을 사용하여 내장 된 “지연”을 호출하지만 스크립트 편집기 내에서 작동하지만 애플릿 내에서 사용될 때 오류를 반환합니다. t 지연 계속. (-1708)”). “계속”을 사용하는 대신 지연 명령을 처리하도록 AppleScript에 직접 지시하여이 문제를 해결했습니다.]
문제는 delay
스크립트를 일시 중지하는 동안 사용자 입력 을 처리하므로 애플릿에 의해 표시되는 메뉴 또는 창을 계속 클릭 할 수 있으며 delay
스크립트 실행을 다시 시작하기 전에 사용자 입력으로 인해 전체 지속 시간을 기다리지 않는 버그 (10.11에서 수정 됨)가 있습니다 . 애플릿과 상호 작용하지 않으면 delay
올바르게 작동합니다.
답변
이 같은 문제를 해결하는 동안 관련 이 없는 질문 에 대한 이 답변 을 발견하고 시도하기로 결정했으며 그것은 나를 위해 일하는 것 같습니다.
간단하게 교체 delay 5
와 do shell script "/bin/sleep 5"
같은 결과를 얻을.
답변
이것이 최선의 해결책이라고 말하지는 않지만 내 문제를 해결 한 것 같습니다. 내가 이해하지 못하는 이유로 무시되는 간단한 지연을 사용하는 대신 새로운 시간에 도달 할 때까지 시간을 보내고 반복하는 것으로 전환했습니다 (아직 지연을 사용하지만 무시해도 문제가되지 않습니다) 스크립트가 시간에 도달 할 때까지 지속되지 않기 때문에 지연).
# Pause for five minutes
set GetTheTime to current date
set NewTime to GetTheTime + (5 * minutes)
repeat while (current date) is less than NewTime
delay 60
end repeat
나는 왜 지연이 무시되고 있는지 (또는 극적으로 빨라 졌습니까?! ??) 알기 위해 죽어 가고 있지만, 이것은 일을 끝내고 서투르게 만듭니다.
답변
독일 포럼 게시물 에서 해결 방법을 찾았 습니다 . 스크립트 맨 위에 다음 행을 추가하십시오.
use framework "Foundation"
use scripting additions
current application's NSThread's sleepForTimeInterval:1
답변
carzyj는 최선의 답변이라고 생각하지만 Chris Page의 방법과 결합하면 다음과 같은 이점을 얻을 수 있습니다.
on delay duration
do shell script "/bin/sleep " & duration
end delay
“지연시”를 통해 “종료 지연”을 주석 처리하여 원래 지연으로 되돌릴 수 있습니다.
답변
이것은 @ chris-page 솔루션의 수정입니다.
응답 성과 지연 시간을 정확하게 캡처하는 것 사이의 균형 인 것 같습니다.
on delay duration
set endTime to (current date) + duration
repeat while (current date) is less than endTime
set delta to duration / 100
if duration < 0.2 then
set delta to 0.2
end if
tell AppleScript to delay delta
end repeat
end delay
그러나 Applescript에 전체 기간 동안 지연하도록 지시하는 대신 일부 기간 동안 지연되도록 지시합니다. 기간이 사과가 허용하는 시간 (1 초의 1/60)보다 짧으면 해당 델타로 설정해 봅시다. 우리는 약간의 응답 성을 유지할 수 있지만 여전히 정확합니다. 의혹은 때때로 지연이 작동하지 않기 때문에 반복 루프가 스레드를 잠근 상태로 유지하지만 성공 시나리오에서는 프로세스가 여전히 중단 될 수 있도록 지연 델타가 짧기를 원합니다.
답변
따라서 모든 것을 종합하기 위해 Chris는 이것을 의미한다고 생각합니다.
on delay duration
set endTime to (current date) + duration
repeat while (current date) is less than endTime
tell AppleScript to delay endTime - (current date)
end repeat
end delay