Как запустить два нескольких потока одновременно в цели C? - PullRequest
0 голосов
/ 06 декабря 2010

Мне нужно запустить два потока одновременно, но я не понимаю, как это сделать.

Я начинаю тему:

[NSThread detachNewThreadSelector:@selector(MyNewThread:) toTarget:[CMyClass class] withObject:nil];    

-(void)MyNewThread:(id)param{
    NSAutoreleasePool *Pool = [[NSAutoreleasePool alloc] init];
    NSString *strSwitcher = @"myCommand";

    const char * cstrSwitcher = [strSwitcher UTF8String];
    system(cstrSwitcher);
    [Pool release];
}

и некоторые другие системные команды, которые я хочу отправить в другом потоке. Когда я отправляю одну системную командную строку, изменения (например, myCommand>).

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

Кто-нибудь может мне помочь ??

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012

Я бы предложил не использовать венгерскую нотацию (Windows подобрала ее еще в дни Win32, но отбросила в .NET), поскольку это только усложняет ситуацию.переименуйте 'Pool' в 'pool', а 'strSwitcher' в 'switcher'.Теперь просто вызовите систему ([switcher UTF8String]);вместо этой дополнительной переменной.Кроме того, удалите NSAutoreleasePool и используйте новое определение @autoreleasepool {}, включающее в себя ваш код.Вот как это выглядит сейчас.

- (void)myNewThread:(id)param {
    @autoreleasepool {
        NSString *switcher = @"myCommand";
        system([switcher UTF8String]);
    }
}

И если вы хотите переключиться на NSTasks, чтобы иметь возможность запускать несколько исполняемых файлов, вот как это происходит: (Я также немного изменил метод.)

- (void)executeTaskAtPath:(NSString *)path withArguments:(NSArray *)arguments {
    @autoreleasepool {
        NSTask *task = [launchedTaskWithLaunchPath:path arguments:arguments];
        [task waitUntilExit]; // This blocks the thread.
    }
}

Чтобы узнать, была ли задача успешно завершена, зарегистрируйтесь для получения уведомления NSTaskDidTerminateNotification в [NSNotificationCenter defaultCenter].

0 голосов
/ 06 декабря 2010

Принимая во внимание информацию в вашем комментарии к OP, я предполагаю, что вы хотите вызвать system() из нескольких потоков одновременно.

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

Спасибо, что JeremyP указал на направление NSTask в комментариях!

В качестве альтернативы можно использовать NSTask.

NSTask, использующий fork() для создания дочернего процесса и вызывающий waitpid() в родительском и execve() (или одинего братьев и сестер) в дочернем процессе.Используя макросы, определенные в <sys/wait.h>, возвращаемое значение дочернего элемента извлекается после его завершения.Таким образом, несколько дочерних процессов могут быть запущены без блокировки других потоков.Вы можете делать все это самостоятельно или просто использовать простой класс NSTask.

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