`
lizaochengwen
  • 浏览: 667248 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iphone -线程 使用run loop对象 2

阅读更多
如果你在非main thread中运行run loop,你必须至少为该run loop添加一个input sources或timer。如果你运行的run loop没有监控任何的输入源,该run loop将在你运行后立即退出。
Run loop observer

        使用detachNewThreadSelector:toTarget:withObject:创建一个thread:

view plain

    [NSThread detachNewThreadSelector:@selector(observerRunLoop) toTarget:self withObject:nil]; 


        在新thread的run loop中添加observer:

view plain

   
- (void)observerRunLoop {  
        //建立自动释放池  
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
          
        //获得当前thread的Run loop  
        NSRunLoop *myRunLoop = [NSRunLoop currentRunLoop];  
          
        //设置Run loop observer的运行环境  
        CFRunLoopObserverContext context = {0, self, NULL, NULL, NULL};  
          
        //创建Run loop observer对象  
        //第一个参数用于分配observer对象的内存  
        //第二个参数用以设置observer所要关注的事件,详见回调函数myRunLoopObserver中注释  
        //第三个参数用于标识该observer是在第一次进入run loop时执行还是每次进入run loop处理时均执行  
        //第四个参数用于设置该observer的优先级  
        //第五个参数用于设置该observer的回调函数  
        //第六个参数用于设置该observer的运行环境  
        CFRunLoopObserverRef observer = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, &myRunLoopObserver, &context);  
          
          
        if (observer) {  
            //将Cocoa的NSRunLoop类型转换成Core Foundation的CFRunLoopRef类型  
            CFRunLoopRef cfRunLoop = [myRunLoop getCFRunLoop];  
            //将新建的observer加入到当前thread的run loop  
            CFRunLoopAddObserver(cfRunLoop, observer, kCFRunLoopDefaultMode);  
        }  
          
        //Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode  
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doFireTimer:) userInfo:nil repeats:YES];  
          
        NSInteger loopCount = 10;  
          
        do {  
            //启动当前thread的loop直到所指定的时间到达,在loop运行时,run loop会处理所有来自与该run loop联系的input source的数据  
            //对于本例与当前run loop联系的input source只有一个Timer类型的source。  
            //该Timer每隔0.1秒发送触发事件给run loop,run loop检测到该事件时会调用相应的处理方法。  
              
            //由于在run loop添加了observer且设置observer对所有的run loop行为都感兴趣。  
            //当调用runUnitDate方法时,observer检测到run loop启动并进入循环,observer会调用其回调函数,第二个参数所传递的行为是kCFRunLoopEntry。  
            //observer检测到run loop的其它行为并调用回调函数的操作与上面的描述相类似。  
            [myRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];  
            //当run loop的运行时间到达时,会退出当前的run loop。observer同样会检测到run loop的退出行为并调用其回调函数,第二个参数所传递的行为是kCFRunLoopExit。  
              
            loopCount--;  
        } while (loopCount);  
          
        //释放自动释放池  
        [pool release];  
    }  


        设置observer的回调函数:

view plain

    void myRunLoopObserver(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) {  
        switch (activity) {  
            //The entrance of the run loop, before entering the event processing loop.   
            //This activity occurs once for each call to CFRunLoopRun and CFRunLoopRunInMode  
            case kCFRunLoopEntry:  
                NSLog(@"run loop entry");  
                break;  
            //Inside the event processing loop before any timers are processed  
            case kCFRunLoopBeforeTimers:  
                NSLog(@"run loop before timers");  
                break;  
            //Inside the event processing loop before any sources are processed  
            case kCFRunLoopBeforeSources:  
                NSLog(@"run loop before sources");  
                break;  
            //Inside the event processing loop before the run loop sleeps, waiting for a source or timer to fire.   
            //This activity does not occur if CFRunLoopRunInMode is called with a timeout of 0 seconds.   
            //It also does not occur in a particular iteration of the event processing loop if a version 0 source fires  
            case kCFRunLoopBeforeWaiting:  
                NSLog(@"run loop before waiting");  
                break;  
            //Inside the event processing loop after the run loop wakes up, but before processing the event that woke it up.   
            //This activity occurs only if the run loop did in fact go to sleep during the current loop  
            case kCFRunLoopAfterWaiting:  
                NSLog(@"run loop after waiting");  
                break;  
            //The exit of the run loop, after exiting the event processing loop.   
            //This activity occurs once for each call to CFRunLoopRun and CFRunLoopRunInMode  
            case kCFRunLoopExit:  
                NSLog(@"run loop exit");  
                break;  
            /* 
             A combination of all the preceding stages 
            case kCFRunLoopAllActivities: 
                break; 
            */  
            default:  
                break;  
        }  
    }  


启动run loop

        启动run loop的方法:无条件启动,设置时间限制启动,在特殊的模式下启动。

        以无条件模式进入run loop是最简单的选择,但并不是最好的选择。以无条件的形式运行run loop将使thread进入一个永久的循环,这样的操作会使用户很难对run loop进行控制。你可以为该run loop添加input source或timer,但能退出该run loop的方法就是kill。这种启动情况下并不能让run loop运行于自定义模式中。

        不同于无条件方式运行run loop,使用时间限制的方式启动run loop更好。当你使用超时时间来对run loop的运行加以限制,则run loop一直运行直至事件到达或达到超时时间。如果是事件到达,run loop将事件分发给handler(处理器)进行处理并在处理完成后退出。你的代码然后重启run loop来处理下一个事件。如果是因到达超时时间而退出,you can simply restart the run loop or use the time to do any needed housekeeping。

       除了超时时间,你还可以运行run loop在特定的模式下。模式和超时时间并不互斥,你可以在启动一个run loop时同时指定超时时间和模式。模式限制了投递事件给run loop的sources的类型,详细的见“iphone——NSRunLoop概念”。
退出run loop
        退出run loop的方法:以超时时间配置run loop启动,显式的停止run loop(调用CFRunLoopStop函数)。
分享到:
评论

相关推荐

    ios (线程 iphone 并发 异步 NSOperation)介绍

    **5.1 使用DispatchQueue替代线程** - **优势**:`DispatchQueue`提供了更简单高效的并发机制。 - **步骤**: - 将原线程中的任务转换为Block。 - 将Block提交给相应的`DispatchQueue`。 **5.2 消除基于锁的代码...

    iPhone App ProgrammingGuide

    7. 主运行循环:解释了iOS应用中的主运行循环(Main Run Loop),它是iOS应用生命周期中的一个关键组成部分,负责处理用户输入和定时事件。 8. 并发和辅助线程:阐述了并发编程的概念,以及如何在iOS应用中有效地...

    iphone programming guide

    “主运行循环”(Main Run Loop)是应用程序中负责接收用户输入、处理定时器、文件描述符事件、异步事件以及执行各种应用逻辑的机制。关于后台执行和多任务处理,文档提供了关于如何确定多任务功能是否可用,以及...

    含热电联供的智能楼宇群协同能量管理策略:基于多主体协同与需求响应的热电混合运行策略研究,“基于Stackelberg博弈与需求响应的智能楼宇群热电协同能量管理策略”,MATLAB代码:含热电联供的智能

    含热电联供的智能楼宇群协同能量管理策略:基于多主体协同与需求响应的热电混合运行策略研究,“基于Stackelberg博弈与需求响应的智能楼宇群热电协同能量管理策略”,MATLAB代码:含热电联供的智能楼宇群协同能量管理 关键词:楼宇能量管理系统;热电联供系统;Stackelberg博弈;需求响应 参考文档:《含热电联供的智能楼宇群协同能量管理》华北电力硕士lunwen 仿真平台:MATLAB 主要内容:本文提出了一种计及热电耦合需求响应的智能楼宇群的多主体协同能量管理策略。 传统热电联供系统采取单一的“以电定热”或“以热定电”运行策略,在实际运用中将无可避免地造成能源的浪费。 针对这一现状,本文采取“热电混合运行”策略对联供系统进行调控,在该运行策略下,运营商可以结合不同时段的价格信息、负荷水平等因素灵活采取使自身收益最大化的运行策略。 在热电协同能量管理层面,以楼宇群运营商的收益以及用户的效益最大化为目标,提出了智能楼宇群内部的优化定价策略,运营商在系统中负责向用户供电与供热,并自主制定电与热价格引导用户进行需求响应;其次,用户具有可平移电负荷以及可削减热负荷,可根据当前的价格信息自

    随机规划下的虚拟电厂与微网双不确定性优化调度模型研究:基于MATLAB与CPLEX的仿真平台实现,计及双重不确定性的虚拟电厂微网日前随机优化调度策略-基于MATLAB与CPLEX平台的研究,MATL

    随机规划下的虚拟电厂与微网双不确定性优化调度模型研究:基于MATLAB与CPLEX的仿真平台实现,计及双重不确定性的虚拟电厂微网日前随机优化调度策略——基于MATLAB与CPLEX平台的研究,MATLAB代码:计及源-荷双重不确定性的电厂 微网日前随机优化调度 关键词:电厂 微网 随机优化 随机调度 源-荷双重不确定性 电厂调度 参考文档:《Virtual power plant mid-term dispatch optimization》参考其燃气轮机、以及储能部分模型,另外随机优化算法也是和该文档一致; 仿真平台:MATLAB+CPLEX 主要内容:代码主要做的是一个电厂或者微网单元的日前优化调度模型,考虑了光伏出力和负荷功率的双重不确定性,采用随机规划法处理不确定性变量,构建了电厂随机优化调度模型。 具体来看,首先是基于蒙特卡洛算法,对预测的光伏以及负荷曲线进行场景生成,然后基于快概率距离快速消除法进行削减,直至削减至5个场景,然后采用随机调度的方法,对多场景下的电厂调度策略进行优化,程序实现效果良好,纯程序为本人亲自所写,一行一注释, ,关键词:虚拟电厂; 微网; 随

    rsyslog-mmaudit-8.24.0-57.el7-9.3.x64-86.rpm.tar.gz

    1、文件内容:rsyslog-mmaudit-8.24.0-57.el7_9.3.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/rsyslog-mmaudit-8.24.0-57.el7_9.3.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

    基于Web的增材制造预处理平台的设计与实现.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    博客系统完整开发流程(上)

    前端博客系统代码

    18考试真题最近的t67.txt

    18考试真题最近的t67.txt

    Javaweb期中作业会议管理系统,SSM+JSP.zip(课设&实训&大作业&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    基于Plecs的模块化多电平换流器设计:PMW调制下的小输出电压纹波半桥子模块实现,基于Plecs实现的模块化多电平半桥换流器,采用PWM调制方式实现低电压纹波输出,用plecs实现的模块化多电平流器

    基于Plecs的模块化多电平换流器设计:PMW调制下的小输出电压纹波半桥子模块实现,基于Plecs实现的模块化多电平半桥换流器,采用PWM调制方式实现低电压纹波输出,用plecs实现的模块化多电平流器,调制方式是PMW,输出电压纹波小,子模块是半桥 ,关键词提取结果:plecs;模块化多电平换流器;PWM调制;输出电压纹波小;半桥子模块;,《Plecs模拟模块化半桥式PWM多电平换流器》——输出低纹波电压的研究与应用

    最新更新!!!上市公司-股票流动性指标(2000-2023年)

    ## 01、数据简介 股票流动性是指股票在市场上被买卖的容易程度和速度,即投资者能够在不造成显著价格变动的情况下迅速买卖股票的能力。 Amihud指标结果这是一个衡量股票流动性的指标,为股票在一段时间的收益率与交易额的比值的负对数值。如果股票交易量的变动会带来股价的剧烈波动(暴涨暴跌),则Amihud指标越大,股票流动性越差;反之,如果交易量的变化对股价变化的影响越小,则说明股票的流动性较好。由于这是一个计算结果,因此需要根据实际的股票交易数据来计算。 数据名称:上市公司-股票流动性指标 数据年份:2000-2023年 ## 02、相关数据 stkcd、年份、证券代码、Amihud指标结果、交易天数。

    Simulink在DSP2833x开发板上的电机控制与通讯模型自动生成代码教程,Simulink在DSP2833x开发板上的电机控制与通讯模型自动生成代码教程,模型开发域控制Simulik自动生成代码

    Simulink在DSP2833x开发板上的电机控制与通讯模型自动生成代码教程,Simulink在DSP2833x开发板上的电机控制与通讯模型自动生成代码教程,模型开发域控制Simulik自动生成代码 DSP2833x基于模型的电机控制设计 MATLAb Simulik自动生成代码 基于dsp2833x 底层驱动库的自动代码生成 MATLAB Simulink仿真及代码生成技术入门教程 内容为Simulink在嵌入式领域的应用,具体是Simulink在DSP28335这块开发版上的应用模型:包括直流电机、PMSM、步进电机控制模型,还有常见的LED、串口、CAN等通讯相关Simulink模型,模型都有相关解释文件。 ,核心关键词: Simulink应用; DSP2833x开发版; 电机控制模型; 直流电机模型; PMSM模型; 步进电机模型; LED模型; 串口模型; CAN通讯模型; 自动代码生成; 底层驱动库。,MATLAB Simulink在DSP2833x上的嵌入式开发:自动生成代码的模型应用与实践教程

    19考试真题最近的t24.txt

    19考试真题最近的t24.txt

    C51/STM32仿真软件,主要通过三极管、电阻、电容、单片机等等元器件进行搭载电路,软件程序调试的过程,完成项目功能

    protues8.17安装包,无须积分,即可下载

    计及电动汽车灵活性的微网三阶段多时间尺度协调调度模型:优化经济调度、实时调整与减少功率波动策略,计及电动汽车灵活性的微网多时间尺度经济协调调度模型,计及电动汽车灵活性的微网多时间尺度协调调度模型 摘要

    计及电动汽车灵活性的微网三阶段多时间尺度协调调度模型:优化经济调度、实时调整与减少功率波动策略,计及电动汽车灵活性的微网多时间尺度经济协调调度模型,计及电动汽车灵活性的微网多时间尺度协调调度模型 摘要:构建了含有电动汽车参与的微网 电厂多时间尺度协调优化模型,其中包括日前-日内-实时三阶段,日前阶段由于风光出力具有不确定性,结合风光预测值作初步经济调度;日内阶段,风光出力观测的更加准确,通过调节储能、需求响应等单元对调度方案作进一步调整,避免遭受高额的不平衡惩罚;实时阶段,风光出力的预测结果更准确,为了进一步降低微网与上级电网并网功率的波动性,充分利用电动汽车的灵活性,调度电动汽车的充放电以减少功率波动,兼顾调度的安全性与经济性。 ,微网协调调度模型; 电动汽车灵活性; 多时间尺度; 风光出力; 储能需求响应; 实时调整; 经济性,电动汽车灵活性的微网多尺度协调调度模型研究

    基于MPC的电动汽车分布式协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的电动汽车协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的分布式电动汽车协同自适应巡航控制,采用上下分层

    基于MPC的电动汽车分布式协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的电动汽车协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的分布式电动汽车协同自适应巡航控制,采用上下分层控制方式,上层控制器采用模型预测控制mpc方式,产生期望的加速度,下层根据期望的加速度分配扭矩;仿真结果良好,能够实现前车在加减速情况下,规划期望的跟车距离,产生期望的加速度进行自适应巡航控制。 ,关键词:MPC(模型预测控制); 分布式电动汽车; 协同自适应巡航控制; 上下分层控制方式; 期望加速度; 扭矩分配; 仿真结果良好; 前车加减速; 跟车距离。,基于MPC的分层控制电动汽车自适应巡航系统,仿真实现前车加减速跟车距离自适应

    MATLAB代码实现电-气-热综合能源系统耦合优化调度模型:精细注释与实用模块子程序,MATLAB实现电-气-热综合能源系统优化调度的精细化建模与求解策略利用电网、热网与气网耦合交互的复杂系统特性进行

    MATLAB代码实现电-气-热综合能源系统耦合优化调度模型:精细注释与实用模块子程序,MATLAB实现电-气-热综合能源系统优化调度的精细化建模与求解策略利用电网、热网与气网耦合交互的复杂系统特性进行深度调度分析,MATLAB代码:电-气-热综合能源系统耦合优化调度 关键词:综合能源系统 优化调度 电气热耦合 参考文档:自编文档,非常细致详细,可联系我查阅 仿真平台:MATLAB YALMIP+cplex gurobi 主要内容:代码主要做的是一个考虑电网、热网以及气网耦合调度的综合能源系统优化调度模型,考虑了电网与气网,电网与热网的耦合,算例系统中,电网部分为10机39节点的综合能源系统,气网部分为比利时20节点的配气网络,潮流部分电网是用了直流潮流,气网部分也进行了线性化的操作处理,代码质量非常高,保姆级的注释以及人性化的模块子程序,所有数据均有可靠来源 ,关键词:综合能源系统; 优化调度; 电气热耦合; 10机39节点; 比利时20节点; 直流潮流; 线性化处理; MATLAB YALMIP; cplex gurobi。,MATLAB代码:电-气-热综合能源系统耦合优化调度

    元器件基础知识文档(适合初学者学习)

    报告电子元器件手册目录,常见电子元器件的参考资料以及70种电子元器件封装等等,非常适合初学者进行学习和掌握。希望大家都能够在电子领域进行深耕。

    19考试真题最近的t63.txt

    19考试真题最近的t63.txt

Global site tag (gtag.js) - Google Analytics