我正在尝试启动一个支持应用程序的列表。然后,我必须等到这些应用程序完成启动后才能继续执行代码。以下是我现在的记录:
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
可能工作,但我还没有研究过。