我需要同时运行两个线程,但我不知道怎么做。
我开始线程:
[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>)。
现在,当我启动另一个线程时,该命令仅在前一个线程停止时才起作用。
任何人都可以帮助我吗?
答案 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。