кажется, что разветвление процесса пожирает определенные строки кода - Objective-C

StackOverflow https://stackoverflow.com/questions/1817351

Вопрос

Вот упрощенная версия моего кода:

- (IBAction)convert:(id)sender
{
    /* these two lines are ignored */
    [textbox setStringValue:@"converting"];
    [convertButton setEnabled:NO];

        pid_t pid;
        if((pid=fork())==-1)
        {
            [log setStringValue:@"couldn't fork a new process."];
            converting = 0;
        [convertButton setEnabled:YES];
            return;
        }else if (pid==0)
        {
            //this is the child
            sleep(2);
            exit(0);
        }else{
            int status;
            waitpid(pid,&status,0);
        }
    }
}

Это довольно простой вызов fork (). Проблема в том, что две строки в самом верху (помеченные комментарием) игнорируются ... кажется, они не выполняются, пока после не завершится разветвленный дочерний элемент. Почему?

Изменить . И что я могу сделать, чтобы это исправить?

Это было полезно?

Решение

Вы действительно действительно действительно не хотите вызывать fork () в приложении Какао. При этом существует около миллиарда различных ошибок, в основном связанных с тем, как различные ресурсы, такие как порты маха и другая инфраструктура привязки системы, выживают через границу fork () . Потоки тоже порождают все виды ада.

Используйте взамен NSTask . Хотя он эффективно выполняет fork () / exec () внутри, он делает это с большой осторожностью, чтобы убедиться, что все сделано правильно.

Другие советы

Возможно, потому что ваш код должен вернуться в основной цикл событий, прежде чем графический интерфейс сможет изменить состояние? Или небольшое изменение, потому что поток, который запускает графический интерфейс, блокируется, пока ваш код выполняет ожидание уровня ядра ()?

bbum понял это правильно. Вот код, который я использовал в итоге:

- (IBAction)convert:(id)sender
{
    task = [[NSTask alloc] init];
    [task setLaunchPath: @"/usr/local/bin/lame"];

    NSArray *arguments;
    arguments = [NSArray arrayWithObjects: file,outputFile, nil];
    [task setArguments: arguments];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskFinished:) name:NSTaskDidTerminateNotification object:task];

    [task launch];  
}
- (void) taskFinished:(NSNotification *)note {
    // code here executes after process finishes    
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top