如何在目标C中同时运行两个多线程?

时间:2010-12-06 12:06:37

标签: objective-c

我需要同时运行两个线程,但我不知道怎么做。

我开始线程:

[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 :(得分:0)

考虑到您对OP的评论中的信息,我假设您想同时从多个线程中调用system()

不幸的是,这不起作用,因为当您调用system()时,您的应用程序会等待子进程退出后立即发送的信号。由于信号对应用程序中的线程一无所知,因此无法同时从多个线程运行system()

感谢JeremyP在评论中指出NSTask的方向!

另一种方法是使用NSTask

NSTask使用fork()创建子进程,并在子进程中调用父进程waitpid()(或其中一个兄弟进程)中的execve()。使用<sys/wait.h>中定义的宏,在完成后检索子项的返回值。这样,可以在不阻塞其他线程的情况下启动多个子进程。您可以自己完成所有这些工作,也可以只使用简单的NSTask类。

答案 1 :(得分:0)

我建议不要使用匈牙利语表示法(Windows在Win32时代选择了这种表示法,但在.NET中将其删除)因为这只会让事情复杂化。重命名&#39; Pool&#39; to&#39; pool&#39;,&#39; strSwitcher&#39;切换到&#39;切换器&#39;现在,只需呼叫系统([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.
    }
}

要确定任务是否已成功终止,请在[NSNotificationCenter defaultCenter]注册NSTaskDidTerminateNotification。