Multithreading 如何唤醒mac中的睡眠线程

Multithreading 如何唤醒mac中的睡眠线程,multithreading,cocoa,Multithreading,Cocoa,我是目标C的新手。我正在使用 [NSThread sleepForTimeInterval:10.0f]; 但当特殊事件发生时,我想唤醒这条沉睡的线索。我该如何唤醒这条沉睡的线 谢谢这是办不到的。如果线程使用该方法休眠,则在时间结束之前无法唤醒它 可以使用NSCondition对象模拟类似的情况。我建议使用NSTimer而不是使用NSThread,这主要是由于休眠线程的执行控制的限制NSTimer允许通过调用invalidate立即取消,该调用可以响应某些用户取消NSTimer提供两种类型的触

我是目标C的新手。我正在使用

[NSThread sleepForTimeInterval:10.0f];
但当特殊事件发生时,我想唤醒这条沉睡的线索。我该如何唤醒这条沉睡的线


谢谢

这是办不到的。如果线程使用该方法休眠,则在时间结束之前无法唤醒它


可以使用
NSCondition
对象模拟类似的情况。

我建议使用
NSTimer
而不是使用NSThread,这主要是由于休眠线程的执行控制的限制
NSTimer
允许通过调用
invalidate
立即取消,该调用可以响应某些用户取消
NSTimer
提供两种类型的触发:重复和非重复。下面的代码使用
NSTimer
对指定的选择器进行重复调用:

//delayInSeconds and intervalInSeconds are NSTimeInterval values calclulated elsewhere
NSDate *fireDate = [[NSDate date] dateByAddingTimeInterval:delayInSeconds];

//Create a timer that will repeat, starting with the fireDate
//Optionally, userInfo could contain an object. checkSomething:
//  would take one parameter, the NSTimer which would carry the userInfo
//timer is a strong property defined for a particular class, as an instance variable.
self.timer = [[NSTimer alloc] initWithFireDate:fireDate
                                      interval:intervalInSeconds
                                        target:self
                                      selector:@selector(checkSomething:)
                                      userInfo:nil
                                       repeats:TRUE];

//Launch the timer on the main run loop
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
休眠NSThread的限制

休眠线程的一个明显缺点是,将其唤醒是一种非常非常规的解决方案(包括使用信号终止进程),剩下的唯一选项之一就是使用标志。这是一个问题,因为将有一个重要的睡眠时间延迟。例如,如果睡眠时间是10秒,那么在读取标志之前可能会有多达10秒的延迟,应用程序会做出响应


由于
sleepForTimeInterval
是一个类方法,因此无法在睡眠线程上调用
cancel

这是一个非常稀疏的问题。您可以编辑它以提供一些代码示例吗?线睡得怎么样?永远不要说永远
sleepForTimeInterval
可能会调用
nanosleep
,如果出现信号,它将在时间段到期之前返回,并且您可以随时进行设置,使信号除了终止睡眠之外没有任何作用。然而,在给定的上下文中,您的答案可能是最好的——它不能单独在Cocoa中完成。它可能使用
nanosleep
或其他不可中断的东西。由于没有文档记录,它可以随时更改,因此这根本不是一个选项。Mach/Unix上的用户级进程睡眠是可中断的,就像其他系统调用一样。事实上,改变这一点毫无意义,一个进程可以随时被杀死,并且不能通过“隐藏”在睡眠中来避免死亡!因此,无论
sleepForTimeInterval
是否使用
nanosleep
(确实如此),睡眠本身都是可中断的。所以说,这是一个模糊的选择。但正如我所说的,我不建议将此作为这个问题的答案,这只是好奇到极点的人的一个小道消息:-)谢谢大家的反馈。这只是我正在修补的一个想法。我想让一个线程休眠(或暂停)x秒,同时检查是否发生了事件,如果发生了事件,然后继续线程。如果未发生任何事件,则等待x秒并超时。我现在使用的解决方法如下:我做了一个while循环,让线程休眠1秒。一秒钟后,我醒来检查事件是否被触发。如果发生事件,则退出while循环(如果未减少时间计数),然后返回循环并睡眠。这不是最好的,但也可以。