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に精通されておられるかたおられまいたら、アドバイスをお願い致します。
No.1ベストアンサー
- 回答日時:
実際のものをみていないので、
原因特定は難しいのですが。
ソースを読ませていただいたところ、気になった点。
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];
ご参考にしていただければ幸いです。
お礼が遅くなってしまいすいません。
ご指摘の方法で実行すれば正常に処理ができるようになりました。
しかも、Sleepしないので処理も早くなりました。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Excel(エクセル) エクセルVBA マクロ処理中のポップアップメッセージについて 1 2023/08/04 21:34
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
IF文に時間(何時から何時ま...
-
特定の名前のオートシェイプの...
-
vbaのエラー対応(実行時エラー...
-
【Vb.net】プリンタジョブの取得
-
マクロで、次のコードへ行く前...
-
COBOL OCCURSで指定したデータ...
-
【VBA】エラー処理で別プロシー...
-
シグナル 6(SIGABRT)とは?
-
RaiseEventのメリット
-
エクセルVBAでロックをかけたい
-
ExcelのVBAで、選択したファイ...
-
エクセル画面のちらつきなくす...
-
VBAでBook読み込み時の非表示方...
-
C# 指定時間(秒間)の間処理を...
-
ドリブン??
-
VB6.0で、ランタイムエラーを全...
-
VB6にてネットワーク上にある共...
-
VB6で定時刻処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
IF文に時間(何時から何時ま...
-
マクロで、次のコードへ行く前...
-
特定の名前のオートシェイプの...
-
シグナル 6(SIGABRT)とは?
-
特定のファイルを他のプロセス...
-
ExcelのVBAで、選択したファイ...
-
Excel VBA セルの名前があるか...
-
どう増強すべきか
-
Word VBA。各マクロの間に待ち...
-
【VBA】エラー処理で別プロシー...
-
UWSCのTHREADについて
-
シェルスクリプトでファイル内...
-
ドリブン??
-
Functionで戻り値を複数返す方法
-
iPhoneのニューラルエンジンっ...
-
エクセル VBAで複数セル選択時...
-
COBOL OCCURSで指定したデータ...
-
どうやってもFor文を抜けてしま...
おすすめ情報