Тайм-аут Apple, когда экран заблокирован - PullRequest
2 голосов
/ 09 марта 2011

Я получаю ошибку тайм-аута AppleEvent, когда мой Applescript работает, и заставка включается и блокирует экран.Яблочный скрипт завершает текущую операцию, и при попытке выполнить следующую операцию Finder он не продолжается, а ожидает и истекает время ожидания.

Я не могу увеличить ограничение времени ожидания, так как не буду вообще разблокировать экран.Есть ли способ игнорировать ожидание разблокировки экрана или другое решение этой проблемы?

Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 13 апреля 2011

Лучший ответ, который я получил (от macscripter.net ), - это использовать команды оболочки вместо команд Finder, чтобы избежать этого тайм-аута.

0 голосов
/ 28 марта 2011

Я не могу воспроизвести вашу проблему.Я попробовал следующий сценарий, и он работал нормально даже во время работы заставки.

delay 10
tell application "Finder"
    name of startup disk
end tell
delay 5
tell application "Finder"
    contents of startup disk
end tell

Проблема должна зависеть от конкретных команд, выполняемых вашим сценарием.Что они?

0 голосов
/ 22 марта 2011
0 голосов
/ 26 марта 2011

Я только что провел тест, используя Python + Appscript для выполнения своих сценариев, а не Applescript, и он продолжал без проблем работать в моей системе, когда пользователь был приостановлен (т.е. переходил в окно входа в систему, но спользователь все еще вошел в систему) или если сохранение экрана было запущено.Это был простой скрипт, но предположительно демонстрирующий, что вам нужно было сделать.

Appscript поставляется с ASTranslate, который переводит вызовы Applescript в эквивалентный вызов Python + Appscript.Он не обрабатывает переменные, но, как правило, вы можете немного порезать и вставить, чтобы выяснить, как преобразовать ваш скрипт.Это действительно быстро, и Python - намного более мощный язык для сценариев, чем Applescript.

 #!/usr/bin/python

import sys, os
from appscript import *
import time


def gettodos():
    cs = app(u'iCal').calendars.get()
    for c in cs:
        print c.name()
        tds = c.todos()
        for t in tds:
            print "  ", t.summary()

def test():
    for i in range(1,1000):
        print
        print "Run # " + str(i)
        print
        gettodos()
        time.sleep(10)



if __name__ == '__main__':
    test()

    # change to 0 for success, 1 for (partial) failure
    sys.exit(0) 
0 голосов
/ 11 марта 2011

Я не знаю, как вы могли бы обойти заблокированный экран, чтобы ваш код продолжал работать, однако вы можете использовать оператор if, чтобы при запуске экранной заставки ваш код не выполнялся.Это, по крайней мере, предотвратит ошибку тайм-аута.Например, предположим, что вы по какой-то причине хотели запустить цикл повторения 10 раз, и вы не хотели запускать некоторый код во время работы заставки ... вы можете сделать это.

set i to 0
repeat
    set screenSaverEngineIsRunning to false

    tell application "System Events"
        if (exists process "ScreenSaverEngine") then set screenSaverEngineIsRunning to true
    end tell

    if not screenSaverEngineIsRunning then
        set i to i + 1
        -- do some code here
    end if

    delay 1
    if i is 10 then exit repeat
end repeat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...