2009-08-30 10 views
2

10.6でNSTaskの問題を見たことがある人はいますか?OS X 10.6 Snow LeopardのNSTaskに関する問題

このコードは昨日正常に機能し、今日は動作しません。

NSTask *task = [converter task]; 
[task waitUntilExit]; 
NSLog(@"Task did complete"); 

タスクが(私は出力をチェックし、それは大丈夫です)、行うことになっているものありませんが、プログラムはwaitUntilExit方法で無期限に待機します。私は類似のコードを使用するいくつかの単体テストを持っていますが、それらは以前はすべて渡されていましたが、昨日の時点ではもう機能しません。

+0

出口0を単に引っ張る単純なスクリプトを置き換えるとどうなりますか?あなたが今使っているもののために? –

+0

私は、上記のコードが時には完了し、時には完了までに数秒かかりそうな同様の問題を抱えています。本当に奇妙です! – Locksleyu

答えて

0

ps、top、またはActivity Monitorを確認します。プロセスが終了したことを確認してください。

+0

アクティビティモニターに表示され、正常終了します。変換するファイルは変換され、破損しません。タスクは完了しているように見えますが、完了したことを誰にも知らせてくれません。 – kubi

1

(1)どのようにしてタスクからの出力を処理しますか?その場合、途中のデータを&で読み取らないと、出力のバッファリングがブロックされる可能性があります。

(2)あなたのタスクは、終了する前に標準入力でEOLを待っていますか?もしそうなら、あなたはstdinをつかんで明示的に閉じたいでしょう。

Peterが言ったように、あなたの仕事がまだ動いているかどうかpsをチェックしてください。そうであれば、sampleを使ってサンプリングして、それが何であるか把握します。

1

おそらく、私のコードの10.6で問題に気づいたようです。

私は完全に非同期的な方法で(ほとんどBGPとASのものに関する)ネットワーク情報を得る必要がありました。私にとって理想的な解決策は、公然とアクセス可能なDNSサーバーに特別なDNS TXTレコード要求を送信することですが、Cocoa/Core Foundationはこれらの種類の奇妙なボールDNS要求を行うためのAPIを提供していません。もう1つの方法はshell% whois -h IP 'SPECIAL REQUEST'を使用して、関連する情報を出力から解析することでした。これは私が数時間で立ち上げて実行し、後で戻って真の解決策をとることができるものでした。非常にハッキリですが、1)適切な非同期DNSライブラリを見つけて2)そのAPIの速度を上げ、おそらくラッパーを作成するよりもずっと速いです。

したがって、whoisリクエストを開始するために、バックグラウンドスレッドをフォークするクラスを作成し、次にNSTaskを作成しました。バックグラウンドスレッドは結果を処理するためにNSRunLoopループ内に座っていますが、何らかの理由でNSTaskが死んだか、または[NSThread isCanceled]などであるかどうかを確認するために毎秒〜1/10秒ごとにチェックします。NSApplicationWillTerminateNotification通知も登録できるようにしますアプリが終了している場合は適切なクリーンアップ。

まあ、10.6から...私はもう「すぐに」辞めることができませんでした。 10.5では、すべてが滑らかなガラスであり、アプリケーションは少なくとも知覚的に即座に終了します。 10.6未満で終了すると、アプリがハングします。デバッグでは、全てが詰まっていたことがわかりました.が残っていました。私がこの方法で入手した情報はどれも、アプリの機能にとって重要なものではないので(情報の種類を知っているといいです)、私はちょっとパントして、停止ギャップソリューションとして情報を取得しようとしませんでした。

問題をデバッグするときのクイックパスは、メインアプリケーションがインスタンスNSLockを取得しようとしたときにブロックされていることを示しました。面白いのは、アプリケーションを単なるままにしておくと、アプリケーションは10-20秒から数分の間にどこかで正常に終了するということです.ブロック内に括弧で囲まれたコードが10.5と10.6の間で変更され、 。私はまだそれが起こっている場所を(まだ優先順位ではないが)追跡する必要がある....それらのうちの1つは、それがまだ実行中で、それが安全にそのNSPipeのようなものを取り除くことができる前に、それが完了するのを待っているなら、背景NSTaskを終了しています。

DUP:これはデュープの回答かもしれません...私の最初のものはいずれかに消えたようですか?私はどこに問題があった

[NSThread detachNewThreadSelector: @selector(foo) toTarget: self withObject: task]; 

... 

- (void) foo: (NSTask *) task { 
    [task launch]; 
    [task waitUntilExit]; 
    ... 

+0

それは私の問題のように聞こえる。私はNSLockに触れていません、新しいプロセスはNSTaskを通して完全に制御されていますので、私の問題はどこかにあります。あなたがまだ(まだ)解決策を持っていないのはうってつけですが、何かを見つけたら更新しておきます。 – kubi

2

は、次のような魔法の行を追加する必要があります:それは場合に役立ちます

[task setStandardInput:[NSPipe pipe]]; 
0

わからないが、しかし、あなたは別のスレッドで待機をして試すことができます私はタスクが終了したときにNSNotificationを取得しなかったので、これを修正しました。どうやら、NSTask実装のいくつかのバグが10.6未満である...

関連する問題