NSTaskを同期して使用する必要がありますが、ときどき自分のタスクが 'waitUntilExit'コマンドの下でハングすることがあります。私は、優雅なやり方があるのだろうか - エラー処理方法 - ハンギングタスクを終了して別のものを再起動することができるのだろうか?waitUntilExitを使用してNSTaskを掛ける
7
A
答えて
1
-[task launch]
を使用してタスクを起動し、その完了したかどうかを確認するためにそのisRunning
プロパティを定期的にポーリングできます。所定の時間間隔の後に終了していない場合は、-[task terminate]
に電話をかけて終了することができます。これは、起動するタスクがSIGTERMシグナルを無視しないことを要求します。
タスク終了のポーリングがあなたのケースではあまりにも効率的でない場合は、タスクを起動した後にタイプDISPATCH_SOURCE_TYPE_PROC
のディスパッチソースを設定できます。タスクがNSTask
を介して出力パイプを埋め実行された場合、処理が効果的に戻ってからwaitUntilExit
を遮断する、ハングアップすることを
dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, task.processIdentifier, DISPATCH_PROC_EXIT, dispatch_get_main_queue());
12
注:タスクが終了したときに、このソースは、非同期のイベントブロックを呼び出します。
あなたは、これは、出力パイプのデータは、パイプが閉じる出力への書き込みプロセスまで読まれることになります
[task waitUntilExit];
を呼び出す前に
[task.standardOutput.fileHandleForReading readDataToEndOfFile];
を呼び出すことによって、この状況を防ぐことができます。
問題や様々なソリューションを実証するサンプルコード:
関連する問題
- 1. NSTask waitUntilExitが期待通りに機能しない
- 2. NSTask waitUntilExit jailbreakされたiOS上でアプリをぶら下げよう
- 3. jqueryを使用して値を加算して掛ける
- 4. ExcelのVBAを使用して範囲を掛ける
- 5. VBSを使用して2行列を掛ける
- 6. hmatrixを使用して疎行列を掛ける方法
- 7. PHPで関数を使用して掛け算テーブルを印刷
- 8. シェルコマンドを実行する| (パイプ)NSTaskを使用して
- 9. NSTaskでopenコマンドを使用する
- 10. Rails ActiveRecordを使用したafcolumnの値を掛ける
- 11. JavaScriptを使用してinnerからidにスパンを掛ける方法は?
- 12. howtoはjqgridでfooterdataを使用して行と合計を掛ける
- 13. ビット単位の演算子を使用して整数に5を掛ける
- 14. java 8ストリームを使用してリスト内の値を掛ける方法
- 15. lapack/blasを使用して行列のサブセットを別の行列に掛ける
- 16. SELECTを使用して同じテーブルでデータベースを掛けるためにSELECT
- 17. OpenRefineヘッダー行を掛けて
- 18. BigIntegerにDoubleを掛けて
- 19. ループを使用せずに配列要素を掛ける
- 20. Javaのスレッドを使用して3つの行列を掛けよう
- 21. NSTaskを使用してテール-fに似たものを得るには
- 22. fork()を使って2次元配列を掛ける
- 23. NSTaskはコードの下に使用して、一時的なプロセスココア
- 24. xslをキーで掛ける
- 25. オブジェクトのプロパティを掛ける
- 26. マルチプロセスでexecを掛ける
- 27. INTとTIMEを掛ける
- 28. クロムネイティブメッセージング - 子プロセスを掛ける
- 29. NSURLRequest SpringBoardを掛ける
- 30. 値を掛けるMySQLトリガー
すごいです!それを指摘してくれてありがとう - 私に吊り下げパイプを待っている時間の負荷を節約.. – Jay