有关sleep runloop
来源:互联网 发布:sai for mac中文版 编辑:程序博客网 时间:2024/06/06 12:46
转载自:http://bbs.csdn.net/topics/390244976
sleep完了自动唤醒,貌似没有强制停止sleep的API
如果你想要的是阻塞线程,你应该这样做
比如:
@implementation ViewController{
BOOL
end;
}
…
– (
void
)viewDidLoad
{
[super viewDidLoad];
NSLog(@”start
new
thread
…”);
[NSThread detachNewThreadSelector:@selector(runOnNewThread) toTarget:self withObject:nil];
while
(!end) {
NSLog(@”runloop…”);
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
NSLog(@”runloop end.”);
}
NSLog(@”ok.”);
}
-(
void
)runOnNewThread{
NSLog(@”run
for
new
thread
…”);
sleep(1);
end=YES;
NSLog(@”end.”);
}
但是这样做,运行时会发现,
while
循环后执行的语句会在很长时间后才被执行。
那是不是可以这样:
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
缩短runloop的休眠时间,看起来解决了上面出现的问题。
不过这样也又问题,runloop对象被经常性的唤醒,这违背了runloop的设计初衷。runloop的作用就是要减少cpu做无谓的空转,cpu可在空闲的时候休眠,以节约电量。
那么怎么做呢?正确的写法是:
-(
void
)runOnNewThread{
NSLog(@”run
for
new
thread
…”);
sleep(1);
[self performSelectorOnMainThread:@selector(setEnd) withObject:nil waitUntilDone:NO];
NSLog(@”end.”);
}
-(
void
)setEnd{
end=YES;
}
见黑体斜体字部分,要将直接设置变量,改为向主线程发送消息,执行方法。问题得到解决。
这里要说一下,造成
while
循环后语句延缓执行的原因是,runloop未被唤醒。因为,改变变量的值,runloop对象根本不知道。延缓的时长总是不定的,这是因为,有其他事件在某个时点唤醒了主线程,这才结束了
while
循环。那么,向主线程发送消息,将唤醒runloop,因此问题就解决了。
- 有关sleep runloop
- 有关 Thread.Sleep(2000)
- 有关 Thread.Sleep(2000)
- iOS开发——有关RunLoop
- runloop
- runloop
- runloop
- RunLoop
- RUNLOOP
- RunLoop
- RunLoop
- RunLoop
- runloop
- RunLoop
- runloop
- runloop
- runloop
- runloop
- POJ 3241 Object Clustering (曼哈顿距离最小生成树)
- SDWebImage手动清除缓存的方法
- zend debugger安装配置
- 利用LNMP搭建wordpress
- ios7-录音权限访问-AVAudioSession
- 有关sleep runloop
- 搭建Linux下邮件服务器(extmail+postfix+clamav)
- android面试题总结加强再加强版(二)
- HTML中Get和Post请求的简单了解
- KMP算法
- java基础<多线程>
- android面试题总结加强再加强版(三)
- 【文件】MFC序列化存储分析
- 学习新技术的10个建议