2011-07-10 25 views
3

私はサポートするアプリのリストを立ち上げようとしています。私はその後、コードの実行を続ける前に、それらのアプリの起動が完了するまで待たなければなりません。ここで私が今持っているものです。その後、外部アプリを起動して起動するのを待つ

NSWorkspace *ws = [NSWorkspace sharedWorkspace]; 
int i = 0; 

while (i < [launchApps count]) { 
    [ws launcApplication: [launchApps objectAtIndex: i]]; 
    ++i 
} 

while (![self appsFinishedLaunching]) { 
    NSLog(@"loop"); 
    sleep(1); 
} 

以降:

- (BOOL)appsFinishedLaunching 
{ 
    BOOL doneLaunching = NO; 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

      int i = 0; 
      while (i < [launchApps count]) { 
       NSWorkspace *nws = [NSWorkspace sharedWorkspace]; 
       NSArray *runningApps = [NSArray arrayWithArray:[nws runningApplications]]; 
       for (NSRunningApplication *app in runningApps) { 
        if ([[app localizedName] isEqualToString:[launchApps objectAtIndex:i]]) { 
         if ([app isFinishedLaunching]) { 
          [launchApps removeObjectAtIndex:i]; 
          break; 
         } 
        } 
       } 
       ++i; 
      } 
    if ([launchApps count] == 0) 
     doneLaunching = YES; 

    [pool drain]; 

    return doneLaunching; 
} 

私はコンソールに一つの「ループ」を取得し、すべてがうまくあるlaunchApps内のすべてのアプリを開いて手動で実行する場合。このコードを実行してアプリを起動させると、無限ループに入ります。共有ワークスペース内のNSRunningApplicationsオブジェクトが更新されていないように見えますが、その理由を理解できていないようです。私は何が欠けていますか? Apple Docs on NSRunningApplicationから

+0

あなたは「待っていますか」「食べていますか?タイトルはちょっと面白いです。 – Blender

+0

タイプミス!編集のためのクリスおかげで:) – Kris

答えて

1

@property(読み取り専用、ゲッター= isFinishedLaunching)BOOL finishedLaunching

このプロパティの値は、内部NSApplicationDidFinishLaunchingNotification通知を受信した実行中のアプリケーションに対応します。一部のアプリケーションはこの通知(NSApplicationに依存しないアプリケーション)を投稿しないため、完了した起動として報告されることはありません。

起動したアプリケーションが通知を送信しない場合、このプロパティは使用できません。

質問は、あなたがCocoaアプリケーションを起動しようとしているアプリケーションですか?もしそうでなければ、他の起動機能を調べなければならないかもしれません。 C関数execが動作するかもしれませんが、私はそれを調べていません。

+0

はい、私はココアのアプリでテストしています。アプリケーションがコードを実行する前に起動されていれば動作しますので、終了したものとして表示されます。isFinishedLaunchingループが初めて実行される前にすべての起動が完了している限り開始します。 – Kris

+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ_ 'があなたの' [launchApps objectAtIndex:i] 'のいずれかと実際に等しい名前を返しているのではないですか?いくつかの 'NSLog()'をチェックしたり、いくつかのブレークポイントを設定して、そのセクションをデバッグすることができます。 –

+0

ええ、 '[app localizedName]' '[launchApps objectAtIndex:i]'と '[app isFinishedLaunching]'をテストするためにNSLog()文を入れておきます。コードがアプリを起動すると、アプリ名は同じですが、 '[app isFinishedLaunching]'は決して 'YES'に変わらず、' NO'を返し続けます。 – Kris

関連する問題