2009-08-12 15 views
0

私はローカルのモノサイトを追跡するための小さなアプリケーションを書いています。私はほとんど私自身の使用のためにこれを書いていると私は次のコードを実行し、サーバを起動するにはXcodeのxcodeから端末にコードを実行すると無限ループ

で遊ぶために:

[task setLaunchPath: @"/usr/bin/xsp2"]; 
NSArray *arguments = [NSArray arrayWithObjects: @"--root", [[document selectedSite] valueForKey:@"path"], @"--nonstop" ,nil]; 
[task setArguments: arguments]; 
NSLog(@"argument: %@", arguments); 

NSPipe *pipe = [NSPipe pipe]; 
[task setStandardOutput:pipe]; 

NSFileHandle *file = [pipe fileHandleForReading]; 

[task launch]; 

NSData *inData = nil; 
while ((inData = [file availableData]) && [inData length]) { 
    NSLog(@"%@", [[NSString alloc] initWithData:inData encoding:NSUTF8StringEncoding]); 
} 

[[document selectedSite] setValue:[NSNumber numberWithInt:1] forKey:@"active"]; 

[task release]; 
NSLog(@"opened site"); 

端末が書き込みを停止したことがないので、これは、無限ループになり(私は推測する?)。だから私の質問は、私はどのようにループを停止するのですか?私が不明な場合はコメントしてください。

答えて

0

「端末が書き込みを停止することはありませんか?」と言われると、出力は端末またはコンソールで出力され続けますか?大量の出力が得られない場合は、availableDataブロックへの呼び出しが可能です(the documentationを参照)。 readDataToEndOfFileを試してみましょう。それが助けになるかどうかを確認してください。非常に大きなファイル(UINT_MAXバイトより大きい場合)を除いてループに入れる必要はありません。

また、NSStringをループの各繰り返しでリークする(潜在的に)ことに気づくでしょう。 NSLog()呼び出しの中で文字列を自動解放することを忘れないでください。

+0

Quinnの回答を残して、リークヒントを残してくれてありがとう:) 私がreadDataToEndOfFileを使っているときに、私のアプリもチョーク(死のスピンしているピザホイール)です。 私はターミナルでコードを実行すると、テキストのアドレスに聞く xsp2 のフォロースニペット書き込み:0.0.0.0 ルートディレクトリ:/ユーザー/マッズ ポートでリスニングを:8080(非セキュア)へ ヒット戻りますサーバーを停止します。 –

0

はい.. availableデータは利用可能なデータがないためにブロックされますが、まだファイルの終わりに達していません(おそらくサーバーがパイプの終わりを閉じた場合に起こります)。

解決策の1つは、別のスレッドで出力を聴くことです。あなたのスレッドは決して閉じることはありませんが、CPUを食べることはありません。

関連する問題