IOS 多线程 RUNLOOP 机制 (二)

转载 2015年07月11日 10:31:08
二,何时使用Run Loop
对于辅助线程,在需要和线程有更多交互时,才使用Run Loop。
比如:1)使用端口或者自定义输入源来和其他线程通讯
2)使用线程定时器
3)Cocoa中使用任何performSelector...的方法(参考Table:Performing selectors on other threads
4)使线程周期性工作

三,如何使用Run Loop对象
Run Loop对象提供了添加输入源,定时器和Run Loop的观察者以及启动Run Loop的接口,使用Run Loop包活获取--配置--启动--退出四个过程
1,获取Run Loop的对象
A,通过NSRunLoop获取
// 获得当前thread的Run loop
NSRunLoop *myRunLoop = [NSRunLoop currentRunLoop];
// 将Cocoa的NSRunLoop类型转换程Core Foundation的CFRunLoopRef类型
CFRunLoopRef ç = [myRunLoop getCFRunLoop];
B,使用CFRunLoopGetCurrent()函数
2,配置Run Loop
所谓配置Run Loop主要是给Run Loop添加输入源,定时器或者添加观察者,即设置Run Loop模式。上面函数- (void)observerRunLoop就是配置了一个带有观察者,添加了一个定时器的Run Loop线程。相关对象---CFRunLoopObserverRef对象和CFRunLoopAddObserver函数
3,启动Run Loop
一个Run Loop通常必须包含一个输入源或者定时器来监听事件,如果一个都没有,Run Loop启动后立即退出。
启动Run Loop的方式
1)无条件的---最简单的启动方法,但是退出Run Loop的唯一方式就是杀死它。
2)设置超时时间---预设超时时间来运行Run Loop。Run Loop运行直到某一事件到达或者规定的时间已经到期。
A,如果是事件到达,消息被传递给相应的处理程序来处理,然后Run Loop退出。可以循环重启Run Loop来等待下一事件。
B,如果是规定的时间到期了,可以使用此段时间来做任何的其他工作,然后Run Loop退出,或者直接循环重启Run Loop。
3)特定模式
使用特定模式运行Run Loop
=====Running a run loop: skeleton
- (void)skeletonThreadMain
{
BOOL done = NO;
// Set up a autorelease pool here if not using garbage collection.
.........
// Add Sources/Timers to the run loop  and do any other setup
.........

// The cycle of run loop
do
{
// start  the run loop but return after each source is handled
SInt32 result = CFRunLoopRunInMode( kCFRunLoopDefault, 10, YES );

// if a source explicitly stopped the run loop, or if there are no sources or timers, go ahead and exit.
if( (result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished) )
done = YES;

// Check for any other exit conditions here and set the "done" variable as needed
.........
}while(!done)

// Clean up code here. Be sure to release any allocated autorelease pools
.........
}
注:可以递归运行Run Loop,即可以使用CFRunLoopRun,CFRunLoopRunInMode或者任一NSRunLoop的方法在输入源或者定时器的处理程序里面启动Run Loop
4,退出Run Loop
有两种方法可以让Run Loop在处理事件之前退出
A,给Run Loop设置超时时间
B,通知Run Loop停止---使用CFRunLoopStopped函数可以显式停止run loop
5,线程安全和Run Loop对象
NSRunLoop线程不安全
CFRunLoop线程安全
对Run Loop对象的修改尽可能在所有线程内部完成这些操作
转载自:http://blog.csdn.net/fengsh998/article/details/8601639

相关文章推荐

IOS 多线程 RUNLOOP 机制 (一)

Run Loop       Run Loop就是一个事件处理的循环,用来不停的调动工作以及处理输入事件。使用Run Loop的目的就是节省CPU效率,线程在有工作的时候忙于工作,而没工作的时候...

IOS 多线程 RUNLOOP 机制 (一)

Run Loop       Run Loop就是一个事件处理的循环,用来不停的调动工作以及处理输入事件。使用Run Loop的目的就是节省CPU效率,线程在有工作的时候忙于工作,而没工作的时候...

IOS 多线程 RUNLOOP 机制 (三)

四,配置Run Loop源---配置源的过程就是源的创建调用过程 配置过程分为以下几个阶段---定义/创建(一个源)---安装(将输入源安装到所在Run Loop中)---注册(将输入源注册到客...

iOS中多线程原理与runloop介绍

一.线程概述 有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断。直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样;圆如操作系统,一直运行...

iOS多线程和runLoop介绍

一.线程概述 有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断。直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样;圆如操作系统,一直...

iOS开发多线程-RunLoop

一、什么是RunLoop   1.从字面意思看     1)运行循环     2)跑圈   2.基本作用     1)保持程序的持续运行     2)处理Ap...

iOS中多线程原理与runloop介绍

一.线程概述        有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断。直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样;圆如操作...

iOS开发 多线程原理与runloop介绍

一.线程概述 有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断。直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样;圆如操作系统,一直...

iOS中多线程原理与runloop介绍

一.线程概述 有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断。直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样;圆如操作系统,一直运行...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)