目标c -启动外部应用程序并等待它们启动



我正在尝试启动一个支持应用程序的列表。然后,我必须等到这些应用程序完成启动后才能继续执行代码。以下是我现在的记录:

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;
}

如果我手动运行打开所有的应用程序在启动程序,我得到一个"循环"在控制台,一切都很好。如果我运行这段代码并让它启动应用程序,它就会进入一个无限循环。似乎NSRunningApplications对象在我的共享工作空间没有更新,我不确定我理解为什么。我错过了什么?

From Apple Docs on NSRunningApplication:

@property(readonly, getter=isFinishedLaunching) BOOL finishedLaunching

这个属性的值对应于已经在内部收到NSApplicationDidFinishLaunchingNotification通知的正在运行的应用。有些应用程序不发布此通知(不依赖于NSApplication的应用程序),因此永远不会报告为完成启动。

如果你启动的应用程序没有发布通知,你就不能使用这个属性。

问题是,你要启动的应用程序是Cocoa应用程序吗?如果没有,您可能需要研究其他启动函数;C函数exec可能工作,但我还没有研究过。

最新更新