2015-10-29 16 views
7

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

1

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()); 
12

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:

https://github.com/lroathe/PipeTest

+1

Awesome! Dzięki za wskazanie tego - zaoszczędziło mi mnóstwo czasu na czekanie na wiszącą rurę. – Jay

Powiązane problemy