Запуск внешних приложений и ожидание их запуска - PullRequest
3 голосов
/ 11 июля 2011

Я пытаюсь запустить список поддерживающих приложений. Затем мне нужно подождать, пока эти приложения завершат запуск, прежде чем продолжить выполнение кода. Вот что у меня сейчас:

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 в моей общей рабочей области не обновляются, и я не уверен, что понимаю почему. Чего мне не хватает?

1 Ответ

1 голос
/ 11 июля 2011

Из Apple Docs на NSRunningApplication :

свойство @ (только чтение, getter = isFinishedLaunching)

Значение этого свойства соответствует запущенному приложению, получившему уведомление NSApplicationDidFinishLaunchingNotification внутри. Некоторые приложения не публикуют это уведомление (приложения, которые не используют NSApplication) и поэтому никогда не сообщаются о завершении запуска.

Если запущенное приложение не публикует уведомление, вы не можете использовать это свойство.

Вопрос в том, пытается ли приложение запустить приложение Какао? Если нет, возможно, вам придется изучить другие функции запуска; функция C exec может работать, но я не рассматривал ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...