2011-07-10 92 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对象没有被更新,我不知道为什么。我错过了什么?

+0

你正在为他们“等待”或“吃东西”吗?标题有点有趣。 – Blender

+0

错别字,对不起!感谢克里斯的编辑:) – Kris

回答

1

Apple Docs on NSRunningApplication

@property(只读,吸气= isFinishedLaunching)BOOL finishedLaunching

此属性的值对应于运行的应用程序接收到一个通知NSApplicationDidFinishLaunchingNotification内部。某些应用程序不会发布此通知(不依赖NSApplication的应用程序),因此从未报告为完成启动。

如果您启动的应用程序未发布通知,则不能使用此属性。

问题是,您尝试启动Cocoa应用程序的应用程序?否则,您可能需要调查其他启动功能; C函数exec可能工作,但我没有看过它。

+0

是的,我正在测试与可可应用程序。如果应用程序在运行我的代码之前启动,那么它确实可行,所以只要所有内容在第一次“isFinishedLaunching”循环运行之前完成启动,它就会将其视为已完成启动。 – Kris

+0

嗯...好吧,你有没有检查过以确保'[app localizedName]'返回一个名字,它实际上等于你的任何'[launchApps objectAtIndex:i]'s?你可能想要放入一些'NSLog()来检查这个,或者设置一些断点并调试那个部分。 –

+0

是的,我只是放了一个NSLog()语句来测试'[app localizedName]''[launchApps objectAtIndex:i]'和'[app isFinishedLaunching]'如果这些应用程序是预先启动的,一切都如预期般出来。如果代码启动应用程序,应用程序名称仍然是相同的,但'[app isFinishedLaunching]'永远不会更改为'YES',它只会连续循环返回'NO'。 – Kris

相关问题