يبدو أن عملية التغلب على العملية تتناول خطوطًا معينة من التعليمات البرمجية - 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() في تطبيق الكاكاو. هناك حوالي zillion gotchas مختلفة عند القيام بذلك ، في الغالب تتعلق بكيفية بقاء الموارد المختلفة مثل منافذ ماخ وغيرها من البنية التحتية لربط النظام عبر fork() الحدود. الخيوط تسبب جميع أنواع الجحيم ، أيضا.

يستخدم NSTask في حين أن. في حين أنها تفعل بشكل فعال fork()/exec() داخليًا ، يفعل ذلك بعناية كبيرة للتأكد من أنه يتم بشكل صحيح.

نصائح أخرى

ربما لأن الكود الخاص بك يجب أن يعود إلى حلقة الحدث الرئيسية قبل أن يتمكن واجهة المستخدم الرسومية من تغيير الحالة؟ أو ، تباين طفيف ، لأن الخيط الذي يدير واجهة المستخدم الرسومية محظور أثناء قيام الرمز الخاص بك بعمل WAIT () على مستوى النواة؟

حصلت 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