如何唤醒mac中的睡眠线程

时间:2012-02-29 21:49:39

标签: multithreading cocoa

我是Objective C的新手。我正在使用

安排一个线程进入睡眠状态
[NSThread sleepForTimeInterval:10.0f];

但是当特定事件发生时我想唤醒这个睡​​眠线程。我如何唤醒这个沉睡的线程?

由于

2 个答案:

答案 0 :(得分:1)

这无法完成。如果线程使用该方法休眠,则在时间结束之前无法唤醒。

可以使用NSCondition对象模拟这样的事情。

答案 1 :(得分:0)

我建议使用NSTimer而不是使用NSThread,这主要是由于睡眠线程的执行控制的限制。 NSTimer允许通过调用invalidate立即取消,可以响应某些用户取消来调用该NSTimerNSTimer提供两种类型的触发:重复和非重复。下面的代码使用//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]; 来重复调用指定的选择器:

sleepForTimeInterval

睡眠NSThread的限制

睡眠线程的一个明显缺点是唤醒它是一种非传统的解决方案(涉及使用信号来杀死进程),剩下的唯一选择之一是使用标志。这是一个问题,因为显着的睡眠时间会有延迟。例如,如果睡眠时间是10秒,那么在读取标志之前可能会有多达10秒的延迟,并且应用程序会响应。

由于cancel是一个类方法,因此无法在休眠线程上调用 $.scrollTo($(".mySelector'), 800,{queue:true,offset:{top:-100,left:-1000},margin:true});