2016-04-20 4 views
2

Я новичок в Cocoa и AppleScript. Недавно я хочу что-то делать с помощью команды «do shell script» в Cocoa-AppleScript много раз и одновременно показывать окно с индикатором выполнения, чтобы указать, сколько раз я делал.Асинхронно «скрипт оболочки» в Cocoa-Applescript?

Мой код выглядит следующим образом:

property progressBar: missing value 
on applicationWillFinishLaunching_(aNotification) 
    repeat with i from 1 to 8 
     set progressBar's doublevalue to i 
     do shell script "sleep 1" 
     delay 1 
    end repeat 
end applicationWillFinishLaunching_ 

Это будет отображаться индикатор выполнения и показывает прогресс. Однако окно, содержащее индикатор выполнения, будет неактивным до тех пор, пока повторение не будет завершено. Я думаю, это связано с тем, что приложение Cocoa-AppleScript имеет только один поток, поэтому, когда он выполняет команду «make shell script», графический интерфейс просто не может обрабатывать другие события. Я попытался позволить shellscript работать в фоновом режиме с хвостом «&», но он ведет себя как повешенный и все еще потребляет много времени.

Я думаю, что даже команда «выполнить shell-скрипт» может быть выполнена в фоновом режиме. Мне все равно нужно получать уведомление, когда она завершена, чтобы обновить индикатор выполнения, но я не знаю, как этого достичь.

Так что мой вопрос: как сделать что-то через «сделать сценарий оболочки» асинхронно и быть информированным, когда задание будет завершено, в Cocoa-AppleScript?

(Кстати, если я удалю, что «оттянуть» 1 линия, индикатор не будет даже обновлять, кто-нибудь знает причину?)

+1

Вы имеете право на проблему с одним потоком, что может быть проблемой при попытке сделать этот тип вещей с помощью Applescript. Существуют приложения «обертки» (один приходит на ум, называемый «[Platypus] (http://www.sveinbjorn.org/platypus)»), который может делать то, что вы хотите, поэтому, возможно, подумайте, что это вариант. –

+0

@ l'L'l Я попытаюсь использовать это приложение. Спасибо! –

ответ

0

Использование NSTask. Вам нужно будет использовать несколько строк ObjC для определения обработчика завершения, который обращается к вашему AS-коду, поскольку ASOC не поддерживает сами блоки, но в остальном он делает именно то, что вам нужно.

+0

Фактически причина, по которой я решил использовать AppleScript для этого, заключается в том, что я не хочу изучать ObjC вообще ... Тем не менее, спасибо за помощь. :) –

+1

Если вы хотите асинхронно запускать подпроцесс _and_ получить уведомление о завершении, используйте 'NSTask'. Да, отсутствие поддержки блоков в ASOC классно раздражает, но это не является непреодолимым. Причина, по которой использование 'do shell script' с' & 'не возвращается сразу, состоит в том, что каналы stdout и stderr подпроцесса все еще подключены к вашему процессу; однако, если вы перенаправите их, ваш процесс больше не получит никакой обратной связи. Без сомнения, есть сумасшедшие способы, которыми вы могли бы его убить, но вы просто привязываетесь к узлам и потенциально создаете всевозможные неприятные ошибки. Простое использование ObjC. – foo

+0

Или, предполагая, что вы не выполняете никаких сценариев приложений, это то, что AppleScript делает правильно, вы можете просто забыть об использовании AppleScript целиком, сосать его и пойти учиться Swift. По крайней мере, с Swift вы получите большое, хорошо осведомленное сообщество пользователей, обширную поддержку по инструментам и документам и хорошо поддерживаемый язык, который не является безнадежно обременительным, даже если проклятая вещь глупо сложна и все еще глючит, как муравейники. Но это будущее. – foo

Смежные вопросы