プロが教える店舗&オフィスのセキュリティ対策術

Objective-CのNSTaskからAutomatorで作成したアプリを複数回実行するとフリーズするのですが、原因が分からないのでアドバイスをいただきたく書き込みさせていただきます。

Automatorの処理は、「イメージファイルにサムネールアイコンを追加」するだけの処理です。1度の実行で複数枚の画像を1枚ずつAutomatorに渡して処理を行います。
Automatorの実行は以下のような内容で実行しています。
-(BOOL)imageIcon(NSString *)filePath // 画像ファイルパス
{
NSTask *task = [[NSTask alloc]init];
NSURL *urlfilePath = [NSURL fileURLWithPath:filePath];
NSString *Command = [NSString stringWithFormat:@"/usr/bin/open"];
NSArray *argumets = [NSArray arrayWithObjects:@"-a",
@"Automatorアプリのパス",
[NSString stringWithFormat:@"%@",urlfilePath],
nil];
[task setLaunchPath:Command];
[task setArguments:argumets];
[task launch];
[task waitUntilExit];

// 処理が完了していないのに処理を継続するのを防ぐ為、sleep
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
if([self processList:@"Automatorアプリ名"]){ //psコマンドを実行して、処理中ならYESを返す。
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
}
[task release];
return YES;
}

上記の関数を各画像の処理時に呼び出しています。
上記の関数の先頭部にreturn YESで強制的に処理をすると、フリーズは発生しません。
また、フリーズした時は、Automatorアプリが実行中のままとなりますが、アクテビティモニタで見るとAutomatorアプリはありません。
Xcodeのコンソールにも、何も表示はありません。

説明がまとまっていなくてすいません。
どなたか、Objective-Cに精通されておられるかたおられまいたら、アドバイスをお願い致します。

A 回答 (2件)

実際のものをみていないので、


原因特定は難しいのですが。

ソースを読ませていただいたところ、気になった点。
NSTaskでコマンド「open」を使用されていて
[task waitUntilExit];で実行が終わるまで待つというように
書かれていますが、
ファイルに対して、開く命令しか送らないので、
コマンド自体は終わってしまって、
次の処理が走ってしまうのでSleepを入れたのかなと思いました。
#ここらへんが複数回呼ばれたときに悪さをしていないかなと感じました。
#Automatorアプリの起動から終了まで必ず6秒以内なのかとか、その確証はあるのかなど

そこで、
コマンドで、
「Automatorアプリのパス/Contents/MacOS/Automatorアプリ」を実行ファイルに指定することによって
waitUntilExitでAutomatorアプリの動作をSleepなどで待たなくて済むかなと思いました。

#ターミナルで実際に適当なアプリを実行してみたら、アプリが起動して終了するまで
#コマンドは終了していなかったので、使えるかなと思います。

以下のように書き換えてみたらどうでしょうか
NSString *Command = [NSString stringWithFormat:@"Automatorアプリのパス/Contents/MacOS/アプリ名"];
NSArray *argumets = [NSArray arrayWithObjects:
[NSString stringWithFormat:@"%@",urlfilePath],
nil];

ご参考にしていただければ幸いです。
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいすいません。

ご指摘の方法で実行すれば正常に処理ができるようになりました。
しかも、Sleepしないので処理も早くなりました。

本当にありがとうございました。

お礼日時:2010/08/31 10:32

質問1:


Automatorのアプリケーションを起動するのに、NSWorkspaceを使わずに、NSTaskを使う理由はなんでしょうか?

質問2:
Automatorは、複数の項目に対して、一括して高速に処理を行うのが、特長です。それなのに、1項目に対して処理して、アプリケーションを終了して、また1項目に対して処理して、アプリケーションを終了して……を繰り返す理由はなんでしょうか?
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。

お礼日時:2010/08/31 10:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!