RunLoop学习

mcgs定时器操作函数设置方法 针对mcgs定时器函数的操作及设置方法,是学习MCGS组态软件的良好参考资料 立即下载

iOS关于RunLoop和Timer

  RunLoop这个东西,其实我们一直在用,但一直没有很好地理解它,或者甚至没有知道它的存在。RunLoop可以说是每个线程都有的一个对象,是用来接受事件和分配任务的loop。永远不要手动创建一个runloop,它是跟随着每个线程的。一个RunLoop接收两种source的事件:input source和timer source。同时必须知道的是,input source,runloop是异步交付的,而timer source是同步交付的。每个runloop都有一个RunLoop Modes,代表它以何种方式执行。

  我们为什么从来没有感觉到runloop的存在呢,是因为当程序启动,系统默认帮我们启动了一个主线程的runloop,并且一直在运行,直到程序退出。而用户创建的子线程,runloop是需要手动启动的,所以在线程里启动timer或者调用performSelector: withObject:afterDelay:inModes: 是需要启动runloop的。在后面我会介绍到怎么启动。


关于input source :一般来说,input source基本我们用的就是下面几种方式调用的:

Methods 

Description 

performSelectorOnMainThread: withObject:
waitUntilDone:
performSelectorOnMainThread: withObject:
waitUntilDone:modes:

Performs the specified selector on the application’s main thread during that thread’s next run loop cycle. These methods give you the option of blocking the current thread until the selector is performed. 

performSelector: onThread:withObject:
waitUntilDone:
performSelector: onThread:withObject:
waitUntilDone:modes:

Performs the specified selector on any thread for which you have an NSThread object. These methods give you the option of blocking the current thread until the selector is performed. 

  
performSelector: withObject: afterDelay:
performSelector: withObject:
afterDelay:inModes:

Performs the specified selector on the current thread during the next run loop cycle and after an optional delay period. Because it waits until the next run loop cycle to perform the selector, these methods provide an automatic mini delay from the currently executing code. Multiple queued selectors are performed one after another in the order they were queued. 

cancelPreviousPerformRequestsWithTarget:
cancelPreviousPerformRequestsWithTarget:
selector:object:

Lets you cancel a message sent to the current thread using the performSelector: withObject: afterDelay: or performSelector: withObject: afterDelay:inModes: method. 



这是系统帮我们封装了一层,非常容易调用。用户可以创建自己的Port-based input sources,用来监听某个端口的事件跟其他线程通信:
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode;

- (void)removePort:(NSPort *)aPort forMode:(NSString *)mode;

 

就是利用NSPort对象进行的消息传递和delegate,我们一般用不了,有兴趣可以看看NSPort的介绍。

 

关于timer source:就是我们平时用到的NSTimer了。

 

至于我们什么时候需要用到runloop呢,主要是下面几种情况:

1.需要用到NSPort或者其他input source跟其他线程通信。

2.在线程启动timer。

3.在线程里调用performSelector...这类函数去调用。

 

下面我简单用一个例子怎么在线程里启动timer或者performSelector...如下:

复制代码
-(void)testMain

{

  //开启一个测试子线程

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

}



-(void)threadMethod

{

    //没用的timer

    //NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:.2 target:self selector:@selector(timerDone) userInfo:nil repeats:YES];

    

    //真正启动了timer

    NSTimer *timer = [NSTimerscheduledTimerWithTimeInterval:.2target:selfselector:@selector(timerDone) userInfo:nilrepeats:YES];

    [[NSRunLoopcurrentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

    [[NSRunLoopcurrentRunLoop] run];
    

   //同理,调用performSelector也一样
    //[self performSelector:@selector(timerDone) withObject:nil afterDelay:.2];
    //[[NSRunLoop currentRunLoop] run];


}

-(void)timerDone

{

    NSLog(@"Timer Run");

}
复制代码

 

NStimer,几乎每个做iOS开发的程序员都用过,但是有一个关于Timer的介绍估计很多人都不知道:timer是不一定准时的,是有可能被delay的,每次间隔的时间是不一定一样的。

A repeating timer reschedules itself automatically based on the scheduled firing time, not the actual firing time. For example, if a timer is scheduled to fire at a particular time and every 5 seconds after that, the scheduled firing time will always fall on the original 5 second time intervals, even if the actual firing time gets delayed. If the firing time is delayed so much that it misses one or more of the scheduled firing times, the timer is fired only once for the missed time period. After firing for the missed period, the timer is rescheduled for the next scheduled firing time. 

简单解读一下:就是说一个repeat的timer,它在创建的时候就把每次的执行时间算好了,而不是真正启动的时候才计算下次的执行时间。举个例子,假如一个timer在一个特定的时间t激活,然后以间隔5秒的时间重复执行。那么它的执行操作的时间就应该为t, t+5, t+10,... 假如它被延迟了,例如实际上timer在t+2的时候才启动,那么它下次执行的时间还是t+5,而并不是t+2+5,如果很不幸地在t+5还没有启动,那么它理应该在t执行的操作就跟下一次t+5的操作合为一个了。至于为什么会延迟呢,这就跟当前线程的操作有关,因为timer是同步交付的,所以假如当前线程在执行很复杂的运算时,那必须等待运算的完成才能调用timer,这就导致了timer的延迟。

我们就用一个例子来看看效果吧,代码为:

复制代码
 //这里创建timer以每隔1秒执行
 [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerDone) userInfo:nil repeats:YES];
 //这里在第3秒的时候模拟一个复杂运算
 [self performSelector:@selector(busyDone) withObject:nil afterDelay:3];
    
-(void)busyDone
{
    //这里模拟线程复杂的运算
    for(NSInteger i = 0; i< 0xffffffff;i++){
        
    }
    NSLog(@"BusgDone");
}

-(void)timerDone
{
    NSLog(@"Timer Run");
}
复制代码

 

执行结果为:

 

可以看到,timer本来都是以每隔1秒执行,毫秒都是.564,然后在进行复杂的运算时候,timer直接被delay了,当执行完BusyDone之后,立即执行了TimerRun,然后又在.564执行了TimerRun,而不是距离上次执行时间的1秒。

 

转自http://www.cnblogs.com/vicstudio/p/3281682.html。

【AI气象6】Skilful nowcasting of extreme precipitation with NowcastNet 极端降水是气象灾害的重要因素,因此迫切需要通过高分辨率、长时间预报和局部细节的精准短期预报来减轻其社会经济影响。当前的方法存在模糊、衰减、强度或位置误差,基于物理的数值方法在捕捉关键的混沌动态(如对流起始)时面临挑战,而数据驱动的学习方法则未能遵循内在的物理法则(如平流守恒)。我们提出了 NowcastNet,这是一种针对极端降水的非线性短期预报模型,将物理演变方案与条件学习方法统一到一个端到端的神经网络框架中,通过优化预测误差进行训练。基于来自美国和中国的雷达观测数据,我们的模型能够生成物理上合理的降水短 阅读详情

相关推荐

C++常见面试题总结

C++常见面试题总结

xu_fu_yong的专栏 8万+

Python定时任务—sched、timeloop、schedule、apscheduler等

Python定时任务—sched、timeloop、schedule、apscheduler等

魏德曼的博客 1341

MacOS新手必看:HomeBrew安装避坑指南(含M1芯片适配方案)

本文为MacOS新手提供全面的HomeBrew安装指南,特别包含M1/M2芯片适配方案。从系统准备到核心安装流程,再到日常维护和高级配置,详细解析每个步骤的潜在问题及解决方案,帮助用户高效管理Mac软件。

weixin_28831399的博客 471

iOS关于RunLoop和Timer

  RunLoop这个东西,其实我们一直在用,但一直没有很好地理解它,或者甚至没有知道它的存在。RunLoop可以说是每个线程都有的一个对象,是用来接受事件和分配任务的loop。永远不要手动创建一个runloop,它是跟随着每个线程的。一个RunLoop接收两种source的事件:input source和timer source。同时必须知道的是,input source,runloop是异步交...

weixin_30765505的博客 146

IBTrACS v04r01 数据提取实战:Pandas 筛选 JTWC/CMA/JMA 3机构最佳路径数据

本文详细介绍了如何使用 Pandas 高效提取和处理 IBTrACS v04r01 数据集中的最佳路径数据,特别针对 JTWC、CMA 和 JMA 三家权威机构的数据进行对比分析。通过构建可复用的数据提取函数,解决多机构数据质量差异问题,并提供高级分析与可视化应用示例,助力热带气旋研究。

clijovtbq401783153的博客 517

非华为电脑也能用!华为电脑管家完美安装教程来了

GitHub 上有一个开源项目 ​****​,专门解决“非华为设备无法安装华为电脑管家”的问题。它通过智能模拟 + DLL 劫持技术,绕过官方对硬件型号的检测,让你在联想、戴尔、华硕甚至 DIY 主机上也能流畅使用华为电脑管家!⭐ 项目已获 ​700+ Stars​,社区活跃,持续更新,兼容性优秀!科技不该有围墙。如果你成功在非华为电脑上跑起了 PCManager,欢迎在评论区晒出你的设备型号 + 使用体验!也别忘了把这篇推文分享给同样“眼馋”华为生态的朋友 ~📱 ​关注我们。

程序员朱永胜 4934

fdbus普通client-server示例及接口说明

本篇是本人在学习fdbus过程中,为了厘清通信客户端和服务器之前的通信逻辑,以便后续回头看的时候能快速厘清。

sinat_18187903的博客 6544

Keysight ADS新手必看:3分钟搞定TDR模拟的保姆级教程(附差分信号设置技巧)

本文为Keysight ADS新手提供TDR模拟的保姆级教程,详细介绍了从基础环境准备到差分信号设置的全流程。通过内置模板调用、待测器件连接和仿真结果解读,帮助用户快速掌握TDR模拟技术,特别包含差分信号配置技巧,提升信号完整性分析效率。

weixin_30872157的博客 197

IOS学习笔记-perFormSelector,RunLoop,Debug神器,UIResponder,Cocoa Touch事件处理

1,为什么需要多线程 当程序中需要一些比较耗时的操作的时候,这时候我们可以开辟多个线程,让子线程去执行比较耗时的操作,主线程继续相应用户的其它操作。比如下载图片等。 1)获取网络图片显示出来的方法: // 1. url, 确定一个网络上的资源路径 NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/image/p

hell03W 2511

AI驱动视频剪辑自动化:cutcli命令行工具重塑工作流

视频剪辑自动化是提升内容生产效率的关键技术,其核心原理在于通过程序化指令替代手动操作,将创意执行过程代码化。这项技术的价值在于能够将创作者从重复性劳动中解放,实现批量化、标准化的视频内容生产,尤其适用于社交媒体运营、产品宣传等高频产出场景。通过封装专业软件(如剪映/CapCut)的底层草稿格式,自动化工具在保证工业级渲染质量的同时,提供了可编辑的中间态,为AI智能体(Agent)与生产工具的结合提供了清晰接口。本文以cutcli为例,深入探讨了如何通过命令行工具和AI助手,构建从自然语言指令到可编辑视频草稿

weixin_27210125的博客 1065

【推荐算法】召回模型总结

【推荐算法】召回模型总结

m0_48086806的博客 6246

iOS--RunLoop原理

一文带你了解滚动tableview时timer阻塞的原理!

ScheenDuan的博客 1742

别再让电池充不满!用CN3791芯片设计太阳能充电电路,这几个调试坑我帮你踩了

本文详细解析了使用CN3791芯片设计太阳能充电电路时的常见调试问题及解决方案。从RCS电阻的选择到MPPT电压偏差的修正,再到线路损耗和温度补偿的优化,提供了全面的避坑指南。通过实测数据和优化方案,帮助工程师提升锂电池充电效率,确保太阳能充电电路的稳定性和可靠性。

weixin_42528191的博客 241

【iOS】RunLoop学习

这篇博客起源于一个问题,为什么自动轮播图在滑动tableView时就停止滚动了。以上就是我学习RunLoop的总结,后续我讲继续补充完善我的博客。

2401_87841908的博客 401

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

RunLoop学习总结

文章目录初识RunLoop概念代码模型(Event Loop)RunLoop对象RunLoop相关的类CFRunLoopModeRefRunLoop 的 Mode类型RunLoop与线程RunLoop运行逻辑RunLoop 的内部逻辑 初识RunLoop Runloop 是和线程紧密相关的一个基础组件,是很多线程有关功能的幕后功臣。尽管在平常使用中几乎不太会直接用到,理解 Runloop 有利于我...

weixin_44824650的博客 523

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【iOS】——RunLoop学习

一个线程一次只能执行一个任务,执行完毕后就会退出。do {//获取消息//处理消息} while (消息!= 退出)这种模型通常被称为Event Loop,Event loop 在很多系统和框架都有实现。例如:Node.js 的事件处理,Windows 程序的消息循环,而在macOS、iOS中就是Run Loop。简单的说RunLoop其实就是一种循环,通过这种循环得以让应用程序持续运行,让线程能随时处理事件,并在线程需要进行事件处理时忙起来,在不需要进行事件处理时闲下来。

m0_73974920的博客 2763

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Runloop 学习之概念

Runloop 学习之概念 原文 runloop 介绍 RunLoop 还是比较顾名思义的一个东西,说白了就是一种循环,只不过它这种循环比较高级。一般的 while 循环会导致 CPU 进入忙等待状态,而 RunLoop 则是一种“闲”等待 一个RunLoop对象,主要包含了一个线程,若干个Mode,若干个commonMode,还有一个当前运行的Mode 当我们需要一个常驻线程,可以让...

csdn_coder_zxq的博客 249

「iOS」——RunLoop学习

RunLoop是iOS中实现线程常驻的关键机制,本质是一个事件循环模型。它通过NSRunLoop和CFRunLoopRef两种API实现,前者是线程不安全的面向对象封装,后者提供线程安全的C函数接口。RunLoop与线程一一对应,主线程RunLoop自动创建,子线程需手动获取并启动。 RunLoop核心包含五种对象

2301_80253909的博客 1647

iOS Runloop再学习

文章目录常驻线程 常驻线程 iOS RunLoop与NSTimer RunLoop与多线程 - 2.1 iOS 多线程:『RunLoop』详尽总结 - 4.3

baidu_40537062的博客 1185

iOS Runloop学习

这篇文章是在看了sunnyxx大神的线下分享后整理的学习笔记(文中部分图片出自视频,所以不太清晰,文末会放上视频链接) 概念 Runloop就像它的名字一样,就是跑环.我的理解就是一个死循环.是一个可以随时睡眠,随时唤醒的死循环 大家可以想一下,手机app为什么会一直运行?而且在接收到用户点击等等操作时就会有所反映.这个离不开runloop. iOS app启动时就会启动一个runloop

Crazy Panda 973

Runloop学习总结

1       直线型线程与圆型线程 有些线程执行的任务是一条直线,起点到终点;而另一些线程要干的活则是一个圆,不断循环,直到通过某种方式将它终止。        这两类线程能很好的区别Web开发与客户端开发,Web开发中,每次响应都是直线线程,执行完后即释放资源,结束了;而客户端开发中,每次事件响应其实都是产生一个圆,执行操作虽然完成了,但是重要资源与上下文状态都存储在后台。       

junbaozi的专栏 822

RunLoop的学习总结

一. RunLoop相关概念1. 什么是RunLoopRunLoop与线程相关且是基础框架的一部分。一个RunLoop就代表一个事件处理循环,它可以不停的调度工作以及处理输入事件。使用RunLoop的目的是有效的控制线程的执行和休眠,让线程在有工作的时候忙于工作,而在没工作的时候处于休眠状态。如果不使用RunLoop类似的循环机制,线程执行完当前任务队列中的任务就结束了,程序不能持续运行。也可以把R

诠释完美 2324

RunLoop 学习

RunLoop概念:控制线程的生命周期并接收事件进行处理的机制。 通过RunLoop解决如scrollerView或TableView之类的滑动拖动事件 导致timer暂停的问题。 [[NSRunLoop mainRunLoop]addTimer:_timer forMode:NSRunLoopCommonModes] 特别注意:RunLoop的每个循环必须加上@autoRe

a62548319的博客 284

23、RunLoop学习

RunLoop学习RunLoop的本质为什么main函数可以保持一直运行不退出RunLoop数据结构CFRunLoopCFRunLoopModeSource/Timer/OberserverCFRunLoopSourceCFRunLoopTimerCFRunLoopObserver各个数据结构之间的关系RunLoop的ModeRunLoop事件循环的实现机制点击一个app图标打开app到app杀死,经历了哪些过程RunLoop与NSTimer滑动TableView的时候,我们的定时器还会生效吗?RunLoo

重楼的博客 753

Runloop 学习之实现

RunLoop实现 获取RunLoop 从苹果开放的API来看,不允许我们直接创建RunLoop对象,只能通过以下几个函数来获取RunLoop: CFRunLoopRef CFRunLoopGetCurrent(void) CFRunLoopRef CFRunLoopGetMain(void) +(NSRunLoop *)currentRunLoop +(NSRunLoop *)mainRunLo...

csdn_coder_zxq的博客 210

Runloop 学习之 CFRunloopSource

CFRunloopSource CFRunloopSource 定义 struct __CFRunLoopSource { CFRuntimeBase _base; uint32_t _bits; //用于标记Signaled状态,source0只有在被标记为Signaled状态,才会被处理 pthread_mutex_t _lock; CFIndex _order...

csdn_coder_zxq的博客 886
上一篇: KVO学习
下一篇: mansory使用记录&&NSLayoutConstraint-代码实现自动布局
Even_DC
博客等级 码龄12年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值