Yosemite (한국어)

참고 : OS X 10.11 El Capitan에서 delay 문제가 해결되었습니다.

요세미티로 업그레이드 한 이후로 지연을 사용하는 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 초가 걸립니다. Script Editor (이전 Applescript Editor)에서 실행하면 완료하는 데 30 초가 걸립니다. 하지만이 스크립트를 앱으로 저장하면 앱을 시작할 때 지연이 무시되고 앱이 완료되는 데 몇 분의 1 초가 걸립니다.

Applescript가 지정된 시간 동안 지연되도록하려면 어떻게해야합니까? 다음 단계로 넘어 가기 전에 요세미티 결함입니까? 신뢰할 수있는 해결 방법이 있습니까?

댓글

  • Mac (10.10.1)에서 예상대로 작동합니다.
  • 어떤 아이디어 내에서 작동하지 않는 원인은 무엇입니까? 명확히하기 위해 스크립트 편집기에서 작동하지만 스크립트를 앱으로 저장 한 다음 앱을 실행하면 지연이 무시됩니다. ‘ 가장 이상한 점입니다.
  • 10.10.3에서도 동일한 문제가 있습니다.
  • Apple에보고 됨 : openradar.me/21588747
  • 이 문제는 OS X 10.11 El Capitan에서 수정되었습니다.

답변

참고 : 는 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!" 

[참고 : 일반적으로 사용자 지정 처리기는 “지연 지속 시간”을 사용하여 기본 제공 “지연”이지만 스크립트 편집기 내에서 작동하지만 애플릿 내에서 사용하면 오류가 반환된다는 것을 발견했습니다 (“지연을 계속할 수 없습니다. (-1708)”). “계속”을 사용하는 대신 지연 명령을 처리하도록 AppleScript에 직접 지시하여이 문제를 해결했습니다.]

문제는 delay가 사용자를 처리한다는 것입니다. 스크립트를 일시 중지하는 동안 입력 할 수 있으므로 애플릿에 표시된 메뉴 또는 창을 계속 클릭 할 수 있으며 사용자 입력으로 인해 delay가 기다리지 않는 버그 (10.11에서 수정 됨)가 있습니다. 스크립트 실행을 재개하기 전 전체 기간. 애플릿과 상호 작용하지 않으면 delay가 올바르게 작동합니다.

댓글

  • 모두 이 버그가 버그입니까, 아니면 Yosemite에서 이러한 방식으로 지연이 작동하는 이유가 있습니까?
  • 지연이 지연되지 않는 것이 ‘ 버그입니다.
  • 그것이 ‘ 너무 이상합니다. 지난 밤에 지연을 사용하는 애플 스크립트를 만지작 거리다가 갑자기 지연이 다시 올바르게 작동합니다. 버그가 수정 된 것으로 간주했습니다. . 한 시간 후 아무 것도 변경되지 않았지만 버그가 다시 발생했습니다. ‘ 정말 당황했습니다. ‘ 문제가되지 않습니다. . 저는 ‘ 변수를 사용하여 5 분 후까지 시간과 지연을 설정하고 (예 🙂 완벽하게 작동합니다 ‘ . 그래서 … 문제가 해결되었지만 ‘ 문제가 존재하는 이유를 설명하지 않습니다. 흥미롭고 흥미롭고 흥미 롭습니다.
  • Apple이 실수했기 때문입니다. Apple 소프트웨어는 매년 OS X를 출시하기 시작했기 때문에 훨씬 덜 안정적입니다. OS가 견고했던 상위 OS X 마이너 버전 (10.6.8과 같은)이 그리워요. ‘ 더 이상 그런 경험을 얻지 못합니다.
  • 그것이 ‘ 버그 인 경우 (동의합니다. with), 왜 ‘이 문제가 아직 해결되지 않았는지 궁금합니다. 여기 누가 레이더보고를 했습니까? 그렇다면 ID를 게시 해주시겠습니까? (또는 openradar.me에 게시)

답변

이 같은 문제를 해결하는 동안 제가 발견 한 이 답변 별로 관련이없는 질문 에 대한 답변을 제공하고 시도하기로 결정했습니다. 나를 위해 일하십시오.

delay 5do shell script "/bin/sleep 5"로 바꾸고 동일한 결과를 얻으십시오.

댓글

  • 공유해 주셔서 감사합니다! 앞서 말했듯이 ‘이를 테스트 할 수 없습니다. 왜냐하면 이해가되지 않는 이유로 지연 5가 지금 당장 작동하고 있기 때문입니다 (방금 테스트 잠시 전에 다시). 나는 이것이 때때로 작동하고 때로는 실패하는 이유를 모릅니다.’ 너무 이상합니다. 나는 현재 시간을 가져와 변수로 설정 한 다음 시간에 1 분을 더한 값이 될 때까지 스크립트를 일시 중지하는 방법을 사용했습니다 (분명히 1 분 지연). ‘ 투박하지만 ‘는 몇 달 동안 완벽하게 작동하는 반면 간단한 지연은 간헐적이었습니다. 으.
  • 10.10.5를 실행 중이며이 솔루션은 작동하지 않으며 절전 기간 동안 스크립트를 잠급니다.
  • @Greg : “스크립트를 잠급니다” 수면 시간은 ‘ 작동합니다. /bin/sleep는 절전 시간 동안 대기하고 완료 될 때까지 돌아 오지 않습니다. 반대로 AppleScript ‘의 내장 delay 명령은 스크립트가 일시 중지 된 동안 사용자 입력 이벤트를 처리합니다. (버그가있는 곳 : 사용자 키보드 입력이있는 경우 delay는 지연 기간이 완료되기 전에 스크립트 실행을 계속합니다.)

답변

이게 최선의 해결책은 아니지만 내 문제가 해결 된 것 같습니다. 단순한 지연을 사용하는 대신 무시되고 있습니다. 이해가 안되는 이유로 새로운 시간에 도달 할 때까지 시간을 가져 와서 반복하는 것으로 전환했습니다 (여전히 지연을 사용하지만 스크립트가 지연 될 때까지 계속되지 않기 때문에 지연을 무시해도 문제가되지 않습니다. 시간에 도달했습니다.

# 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 

저는 여전히 지연이 무시되는 이유 (또는 급격히 빨라지는?! ??)를 알고 싶지만 작업이 서투른 상태입니다.

댓글

  • ” 지연 ” 명령이 ‘ ” 속도가 빨라지지 ” , 그것 ‘가 중단됩니다. 지연하는 동안 키보드 입력 이벤트가 있는지 확인하는 루프에 앉아 Command-Period를 확인할 수 있습니다. 사용자 입력이 감지되면 지연 루프를 잘못 종료하는 것 같습니다.
  • 흥미 롭습니다! Mac이 유휴 상태 인 경우에도 ‘ ‘이 (가) 무시되고 (속도가 빨라 졌습니까? 중단 되었습니까?) 발견되지만 ‘ 이유를 모릅니다.
  • 사용자 입력 이벤트가 이벤트 대기열에 있으면 delay가 계속 이벤트를 처리하고 대기열에서 제거 할 때까지 중단됩니다.

답변

작업을 찾았습니다. 독일 포럼 게시물 에 있습니다. 스크립트 상단에 다음 줄을 추가합니다.

use framework "Foundation" use scripting additions current application"s NSThread"s sleepForTimeInterval:1 

댓글

  • I ‘ 어떤 이유로 든 현재 Mac에서 지연이 예상대로 작동하기 때문에 답변을 테스트하는 데 문제가 있습니다. 나는 이유를 모른다. ‘ 10.10.3을 실행 중입니다. 아마도 Apple이이 버그를 수정했을까요? 또는 ‘ 현재 Mac에 영향을주지 않는 ‘ 간헐적 인 문제 일 수도 있습니다. 으. 위에서 말했듯이 해결 방법은 Applescript가 현재 시간을 얻은 다음 현재 시간에 x를 더할 때까지 지연하는 것입니다.
  • 저는 10.10.3도 실행 중이며 여전히 문제가 나타납니다. 모든 사람이 문제를 보는 것은 아니기 때문에 ‘ 간헐적이거나 타사 소프트웨어 또는 특정 환경 설정과 관련이있을 수 있습니다. 누가 알아. BTW, 해결 방법은 앱이 대기하는 동안 CPU 시간을 100 % 계속 사용한다는 단점이있을 수 있지만 적절한 지연 동작은 해당 기간 동안 앱을 절전 모드로 전환하여 전력을 덜 사용하는 것입니다.
  • 10.10.5를 실행 중이고이 솔루션이 작동하지 않습니다.
  • @ThomasTempelmann : 사용자 입력이있을 때 문제가 발생합니다. 스크립트가 실행되는 동안 클릭하거나 입력하지 않으면 ‘ 버그가 ‘ 트리거되지 않습니다.
  • 이 솔루션을 사용하면 응용 프로그램이 실제로 절전 기간 동안 정지됩니다. delay는 스크립트가 일시 중지 된 동안 사용자 입력을 처리하므로 예를 들어 메뉴 및 창과 계속 상호 작용할 수 있습니다.

답변

carzyj는 제가 가장 좋은 답변이라고 생각하는 것을 가지고 있었지만 Chris Page의 방법과 결합하면 다음과 같은 결과를 얻을 수 있습니다.

on delay duration do shell script "/bin/sleep " & duration end delay 

지연시부터 지연 종료까지 주석 처리하여 원래 지연으로 되돌릴 수 있습니다.

댓글

  • I 또한 이것을보기 전에 유사한 코드를 수정했습니다. 저는 10.10.5를 실행 중이며이 솔루션은 작동하지 않으며 절전 기간 동안 스크립트를 잠급니다.

답변

@ 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/60 초)보다 작다면, 그 델타로 설정합시다. 우리는 약간의 응답 성을 유지할 수 있지만 여전히 정확합니다. 의심은 때때로 지연되지 않는다는 것입니다. 반복 while 루프가 스레드를 잠긴 상태로 유지하도록 작동하지만 성공 시나리오에서는 프로세스가 여전히 중단 될 수 있도록 지연 델타가 짧기를 원합니다.

Comments

  • 요청 된 지연을 줄이는 것은 불필요하며 스크립트 실행 속도를 낮추고 대기하는 동안 더 많은 CPU를 소비 할 수 있습니다. 내 버전은 원하는 전체 기간이 경과 할 때까지 지연을 호출하기 만하면 delay가 실행을 계속하기 전에 최대한 지연 할 수 있습니다.
  • 이 답변 이후 게시 된 후 delay duration 대신 delay endTime - (current date)를 사용하도록 코드를 업데이트하여 delay ‘ 중단되지 않음 ‘ 원래 요청 된 시간보다 더 오래 스크립트를 일시 중지하지 않습니다. ,이 답변으로 해결하려고했던 것일 수 있습니다.

답변

그래서, 이 모든 것을 합치면 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 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다