Как использовать детерминированный NSProgressIndicator для проверки хода выполнения NSTask?- Какао

StackOverflow https://stackoverflow.com/questions/8889006

Вопрос

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

Вот как я запускаю скрипт:

родовое слово

Мне нужно поместить индикатор выполнения, который проверяет ход выполнения этой задачи, пока она выполняется, и обновляется соответствующим образом.

Это было полезно?

Решение

Вот пример асинхронной NSTask, запускающей скрипт unix.В сценарии Unix есть команды echo, которые возвращают текущий статус стандартной ошибке, например:

echo "working" >&2

Это обрабатывается центром уведомлений и отправляется на дисплей.

Чтобы обновить определенный индикатор выполнения, просто отправьте обновления статуса, такие как «25.0», «26.0», конвертируйте в плавающее и отправьте в индикатор выполнения.

примечание: я получил эту работу после множества экспериментов и использования множества советов с этого сайта и других ссылок.так что я надеюсь, что это будет вам полезно.

Вот объявления:

родовое слово

Вот основные программные модули:

родовое слово

Другие советы

У вас должен быть способ перезвонить или прервать выполнение задачи, чтобы узнать, насколько вы продвинулись.Если вы говорите о сценарии оболочки, вы можете разбить 1 сценарий на несколько сценариев, и по завершении части сценария обновить индикатор выполнения.Другие приложения делали такие вещи, iirc Sparkle реализовал некоторую пользовательскую логику в своем коде распаковки, чтобы распаковывать фрагменты, чтобы он мог обновлять индикатор выполнения.Если вы хотите добиться того же эффекта, вам придется сделать что-то подобное.

Get the PID(process ID) for the command which u ran,using it in conjunction with PS(Process state) command you can get the state of your process use that value in your code to show it in the progress bar

a simple way to have your script (nstask) communicate with your obj c controller is by using standard error as a communication channel. Not saying this is perfect but works quite well. You have to setup your task as an asynchronous nstask and use notifications to read from standard input and standard error separately. I can post it later if you need it.

Wrap your script like this:

echo "now starting" >&2
for i in $(ls /tmp)
do 
echo $i 2>&1
done
echo "now ending" >&2

Process Your standard error through a pipe and filehandle and wire it to an outlet for textual status updates or convert it to a float for progress displays. I.e

echo "25.0" >&2. Can be captured and converted.

If you need to capture real std error then trap it and merge it to std out like my example. This is not a perfect approach but I use it frequently and it works well.

On my iPad and don't have code. Let me know if you need a better example.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top