Muszę używać NSTask synchronicznie, jednak okazjonalnie moje zadanie zawiesza się w ramach polecenia "waitUntilExit". Zastanawiam się, czy istnieje pełen wdzięku sposób - metoda obsługi błędów - aby zakończyć zawieszone zadanie, aby ponownie uruchomić inny?Wiszące NSTask za pomocą waitUntilExit
Odpowiedz
Można uruchomić zadanie przy użyciu -[task launch]
, a następnie okresowo odpytywać na jego właściwości isRunning
, aby sprawdzić, czy zostało już zakończone. Jeśli nie zakończyło się po określonym czasie, możesz zadzwonić pod numer -[task terminate]
, aby go zakończyć. Wymaga to, aby uruchomione zadanie nie ignorowało sygnału SIGTERM.
Jeśli jednak odpytywanie w przypadku zakończenia zadania jest zbyt nieefektywne w twoim przypadku, po uruchomieniu zadania możesz skonfigurować źródło wysyłki typu DISPATCH_SOURCE_TYPE_PROC
. To źródło następnie asynchronicznie nazywa swój blok przypadku, gdy zadanie kończy:
dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, task.processIdentifier, DISPATCH_PROC_EXIT, dispatch_get_main_queue());
pamiętać, że jeśli zadanie jest uruchamiane poprzez NSTask
wypełnia rurę wyjściową wówczas proces będzie powiesić, skutecznie blokując waitUntilExit
z powrotem.
Można zapobiec tej sytuacji poprzez wywołanie
[task.standardOutput.fileHandleForReading readDataToEndOfFile];
przed wywołaniem
[task waitUntilExit];
Spowoduje dane rury wyjściowego należy czytać dopóki proces pisania do rury wyjścia zamyka go.
Przykład kodu wykazując problemu i różne rozwiązania:
- 1. Komunikacja między procesami za pomocą NSPipe, NSTask
- 2. Sandbox i NSTask
- 3. Wykonywanie komend powłoki za pomocą NSTask - Objective-C Cocoa
- 4. Subprocess NSTask utknął w _dyld_start
- 5. Rozszerzenie Xcode 8 wykonujące NSTask
- 6. Runtime.getRuntime(). Exec (cmd) wiszące
- 7. Połączenie JDBC wiszące
- 8. wypowiedzieć NSTask i jego dzieci
- 9. Heroku toolbelt logowanie z Cygwin wiszące
- 10. Testy Rspec wiszące z Paperclip
- 11. "idź" wiszące na pewnej bibliotece
- 12. Jak dodać wiszące wcięcie do etykiet pola wyboru spersonalizowanego za pomocą niestandardowych ikon w CSS?
- 13. Pobieranie danych z NSTask w czasie rzeczywistym za pomocą powiadomień nie działa
- 14. NSTask, narzędzia linii poleceń i root
- 15. VS 2008 Intellisense wiszące na prawym kliknięciem
- 16. Virtualenv i Pip wiszące na zawsze
- 17. Python ssl logowanie wiszące na Debianie
- 18. Zobacz StackTrace wiszące Python w futex (... FUTEX_WAIT_BITSET_PRIVATE | ...)
- 19. NSTask/NSPipe odczytano z polecenia Unixa
- 20. NSTask i Git - problemy z uprawnieniami
- 21. Running skrypt z NSTask powoduje błąd posix_spawn
- 22. Jak korzystać z NSTask jako root?
- 23. Używanie NSTask i NSPipe powoduje 100% użycie procesora.
- 24. Programowanie gniazda unix C, connect() wiszące na niepoprawnej nazwie hosta
- 25. Ścieżka uruchamiania programu NSTask jest niedostępna. Działa w Xcode. Błąd pokazany na XCode
- 26. Śledzenie za pomocą androida za pomocą opencv
- 27. Jak sprawdzić nazwę elementu za pomocą WriteEndElement
- 28. Jenkins wiszące w "Pobieranie zmian w górę od pochodzenia"
- 29. Uruchamianie plików wykonywalnych z NSTask - problemy z piaskownicą?
- 30. Edycja plików zdalnych za pomocą Emacsa za pomocą uwierzytelniania za pomocą klucza publicznego
Awesome! Dzięki za wskazanie tego - zaoszczędziło mi mnóstwo czasu na czekanie na wiszącą rurę. – Jay