NSRunLoop的浅显概述和原理

YOLOv5添加注意力机制的具体步骤 本文主要介绍了 本文在此篇博客的基础上向YOLOv5-5.0版 本文主要包括以下内容一、CBAM注意力机制添加(1)修改yolov5s主干网络(2)在common.py中添加可调用的CBAM模块(3)向yolo.py文件添加CBAMC3判断语句二、SE注意力机制添加 本文以yolov5s网络为例 一、CBAM注意力机制添加 注意力机制可以添加在backbone,Neck,Head等部分,接下来本文以backbone主干网络为例 (1)修改yolov5s主干网络 1.在yolov5-5.0工程文件夹下,找到m 阅读详情
Iphone开发-NSRunLoop概述和原理

1.什么是NSRunLoop?

什么是NSRunLoop呢?根据大众化的理解,NSRunLoop就是一种消息处理机制,但是我理解为在程序运行时创建对消息的一种对线程的监听循环,让线程在有消息接收时处理消息,没有就进入睡眠,避免占用过多的内存,这也为多线程的处理成为可能。

2.利用NSRunLoop阻塞NSOperation线程

这里主要介绍一下使用NSRunLoop阻塞线程。
主要使用在NStimer定时启用的任务或者异步获取数据的情况如socket获取网络数据,要阻塞线程,直到获取数据之后在释放线程。
下面是线程中没有使用NSRunLoop阻塞线程的代码和执行效果:

在MyTask.h文件里:

#import <Foundation/Foundation.h> 
@interface MyTask : NSOperation {     
} 

@end

在MyTask.m文件里:

#import "MyTask.h"
@implementation MyTask
- (void)main
{
    NSLog(@"开始线程=%@",self);
   [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(handleTime:) userInfo:nil repeats:NO];
}
#pragma previous function:
- (void)main
{
   NSLog(@"开始线程=%@",self);
    [NSTimer timerWithTimeInterval:2 target:self selector:@selector(hiandeTime:) userInfo:nil repeats:NO];
}
- (void)handleTime:(id)sender
{
    NSLog(@"执行了NSTimer");
    _didDisconnect = true;
}
- (void)dealloc
{
    NSLog(@"delloc mytask=%@",self);
}
@end

在你的视图控制器的viewDidLoad方法里添加如下代码:

- (void)viewDidLoad

{

  NSOperationQueue *queue=[[NSOperationQueue alloc] init];
    MyTask *myTask=[[MyTask alloc] init];
    [queue addOperation:myTask];//将NSOperation的子类添加到队列里,才会执行myTask的main方法
    MyTask *myTask1=[[MyTask alloc] init];
    [queue addOperation:myTask1];
    MyTask *myTask2=[[MyTask alloc] init];
    [queue addOperation:myTask2];

}

执行结果为:

2015-05-18 11:43:27.574 ExampleForNSRunLoop[1816:53652] 开始线程=<MyTask: 0x7f9eaa5a18c0>{name = '(null)'}
2015-05-18 11:43:27.574 ExampleForNSRunLoop[1816:53651] 开始线程=<MyTask: 0x7f9eaa5a3260>{name = '(null)'}
2015-05-18 11:43:27.575 ExampleForNSRunLoop[1816:53658] 开始线程=<MyTask: 0x7f9eaa5a34d0>{name = '(null)'}
2015-05-18 11:43:37.477 ExampleForNSRunLoop[1816:53658] delloc mytask=<MyTask: 0x7f9eaa5a34d0>{name = '(null)'}
2015-05-18 11:43:37.484 ExampleForNSRunLoop[1816:53652] delloc mytask=<MyTask: 0x7f9eaa5a18c0>{name = '(null)'}
2015-05-18 11:43:37.484 ExampleForNSRunLoop[1816:53651] delloc mytask=<MyTask: 0x7f9eaa5a3260>{name = '(null)'}

为什么并没有执行定时器里的方法就将mytask释放了呢?因为程序在执行完main方法里的内容之后就将myTask对象释放掉了,而此时NSTimer还要等待2秒才会执行,因此我们需要一个有效“延迟”程序的东西,等待NSTimer执行完之后才释放掉这个对象,因此我们就用到了NSRunLoop:

在MyTask.m中增加成员变量和while循环,并改写handleTime:方法:

@implementation MyTask
{
    BOOL _didDisconnect;
}
#pragma updated function
- (void)main
{
    NSLog(@"开始线程=%@",self);
    
   [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(handleTime:) userInfo:nil repeats:NO];
    while (!_didDisconnect) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
}

- (void)handleTime:(id)sender
{
    NSLog(@"执行了NSTimer");
    _didDisconnect = true;
}

此时打印结果为:

2015-05-18 11:57:29.648 ExampleForNSRunLoop[1925:57701] 开始线程=<MyTask: 0x7fa640c89930>{name = '(null)'}
2015-05-18 11:57:29.650 ExampleForNSRunLoop[1925:57700] 开始线程=<MyTask: 0x7fa640c8d490>{name = '(null)'}
2015-05-18 11:57:29.652 ExampleForNSRunLoop[1925:57699] 开始线程=<MyTask: 0x7fa640c8d780>{name = '(null)'}
2015-05-18 11:57:31.657 ExampleForNSRunLoop[1925:57700] 执行了NSTimer
2015-05-18 11:57:31.658 ExampleForNSRunLoop[1925:57700] delloc mytask=<MyTask: 0x7fa640c8d490>{name = '(null)'}
2015-05-18 11:57:31.658 ExampleForNSRunLoop[1925:57701] 执行了NSTimer
2015-05-18 11:57:31.659 ExampleForNSRunLoop[1925:57701] delloc mytask=<MyTask: 0x7fa640c89930>{name = '(null)'}
2015-05-18 11:57:31.659 ExampleForNSRunLoop[1925:57699] 执行了NSTimer
2015-05-18 11:57:31.660 ExampleForNSRunLoop[1925:57699] delloc mytask=<MyTask: 0x7fa640c8d780>{name = '(null)'}

因为while循环是在子线程中进行的,并不会阻塞主线程,所以既可以实现等待NSTimer执行完释放对象的效果,又能让主线程继续执行.

matlab 一维相位解缠 一维相位解缠算法的matlab代码实现。 阅读详情

相关推荐

行政数据分析大屏实战:用Tableau从Excel到看板的完整搭建流程(含数据连接与字段计算避坑)

本文详细介绍了如何利用Tableau从Excel数据源搭建行政数据分析大屏的完整流程,涵盖数据准备、连接技巧、计算字段优化、看板设计及动态交互部署。通过五阶工作流,帮助用户高效处理多源异构数据,实现业务洞察与可视化呈现,提升行政数据分析效率。

weixin_29696711的博客 336

NSRunLoop基本原理

iOS 中 的 run loop 浅析 run loop解惑   runloop 虽然是与线程想关的重要概念,但 cocoa 中的 runloop 终是用得不多,观相关博文却也未得入门其“why”。所以浅习几日,得一粗陋分享浅文,作为笔记,写下其所以然。有不对或错误的地方,还望指教,不甚感激。   线程在执行完后,会被销毁。为了使线程能一直运行,咱们可以在线程里边弄个运行循环(run l

听榆大叔的专栏 3532

使用 Python 获取实时港股行情数据

在本教程中,你将学习如何通过 Infoway API 获取港股实时行情数据,具体以腾讯控股(0700.HK)和汇丰控股(0005.HK)为例,使用 Python 进行数据请求和解析。

kk_stoper的博客 1515

NSRunLoop 概述和原理

原文网址:http://www.cocoachina.com/ios/20120703/4414.html   http://www.cnblogs.com/scorpiozj/archive/2011/05/26/2058167.html 一、原理类比C++ 1.什么是NSRunLoop? 我们会经常看到这样的代码: - (IBAction)start:(id)sender

weimibreeze的专栏 678

从FreeCAD到BIMBase:PlaneGCS约束求解器的移植使用指南

本文为BIMBase平台的开发者提供了一份详细的PlaneGCS几何约束求解器移植与集成指南。文章深入探讨了如何从FreeCAD中提取PlaneGCS核心代码,并将其适配到BIMBase的C++二次开发环境中,重点解决了内存管理、数据模型桥接、约束抽象以及性能调优等关键问题,旨在帮助开发者构建稳定高效的参数化设计模块。

weixin_29213525的博客 320

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文,我们在笔记本部署了Llama 3 8B大模型,使用Ollama搭建了基于Web 可视化对话机器人。在使用过程中,大模型经常出现中文问题英文回答的问题。本博文就用Llama3-Chinese-Chat微调模型来解决这个问题……

老牛啊 9238

NSRunLoop原理详解——不再有盲点

编程最怕的就是有盲点,不确定,而runloop官网对其提及的又很少;那么看完这篇应该使你有底气很多~ RunLoop整体介绍 An event-processing loop, during which events are received and dispatched to appropriate handlers. 事件运行循环:就类似下面的while循环部分,当然要复杂很多,...

weixin_30879833的博客 151

NACA0012的O型网格求解

本篇文章采用偏微分方程数值解法生成NACA0012翼型O型网格,并采用速度势方程求解绕NACA0012翼型迎角为0度时的低速不可压无粘流场。 文章目录一、求解网格1.翼型2.远场3.网格4.迭代5.求解二、求解流场1.偏微分方程2.迭代求解流场三、求解参数1.偏微分方程2.迭代求解四、导出数据 一、求解网格 1.翼型 本次求解网格和流场等采用的是NACA0012(修形)对称翼型,在NACA四位翼型中,第一位数字代表的是弯度,第二位数字代表的是弯度位置,后两位数字代表的是厚度,由于本次翼型的前两位数字都为0,

m0_50746433的博客 6675

NSRunLoop概述(转)

1.什么是NSRunLoop?我们会经常看到这样的代码:12345678910- (IBAction)start:(id)sender{pageStillLoading = YES;[NSThread detachNewThreadSelector:@selector(loadPageInBackground:)toTarget:self withObject:nil];[progress set...

weixin_34127717的博客 213

智能座舱测试工程师必看:从零搭建自动化测试框架的5个实战技巧

本文为智能座舱测试工程师提供从零搭建自动化测试框架的5个实战技巧,涵盖环境搭建、ADB高级应用、Python脚本工程化、Monkey测试优化及性能调优。通过ADB深度操作和Python脚本封装,帮助测试人员构建高可复用的智能座舱测试解决方案,显著提升测试效率与问题发现率。

python9snake的博客 631

python实现边缘检测Canny算子 (附完整源码)

python实现边缘检测Canny算子 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 456

NSRunLoop底层原理详解

原文博客地址: NSRunLoop底层原理详解 正常情况下, 一个线程执行完, 程序就会立即退出, 比如一个命令行项目 NSRunLoop是iOS中的消息处理机制,执行完某个事件后线程不会退出,而是进入休眠状态,当再次监测到需要出发事件时,线程激活,继续处理事件,处理完成后再次进入休眠 这种时间运行循环, 类似于一个while循环 默认情况下, 不需要我们手动创建RunLoop, 因为coco...

RunningKing 787

【AI技术赋能有限元分析应用实践】Abaqus有限元分析与深度学习结合20个案例与有限元分析数据来源方法说明

结合 Abaqus 和深度学习,数据的获取和处理是关键的一步。通过从仿真、实验、公开数据库或合成数据中获取数据,经过预处理后,可以将其用于训练深度学习模型。最终,将训练好的深度学习模型与 Abaqus 集成,用于材料行为预测、结构优化、非线性分析、损伤预测等任务,从而提升仿真效率和精度。

源代码杀手的博客 3212

NSRunLoop概述

http://www.cnblogs.com/likwo/archive/2011/07/28/2119777.html 1.什么是NSRunLoop? 我们会经常看到这样的代码: 1 2 3 4 5 6 7 8 9 10 - (IBAction)start:(id)sender { pageStillLoadi

u011248345的专栏 465

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

NSRunLoop概述和原理

首先讲NSRunLoop之前, 说说timer这个东西: 我们把环境都设置在Cocoa中,这里所讲的timer就用NStimer,当然这里的原理适用于其他系统的timer。 因为NSTimer是作为一种timer resource加入到NSRunLoop中去,在当timer的时间累计到规定时间之后就触发timer的action。从这个过程上看来timer应该是很“准时”的,而且现

dark19940411的专栏 506

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NSRunloop,runloop,autoReleasePool和thread的关系理解

NSRunloop NSRunloop顾名思义,就是一个消息循环,它会侦测输入源(input source)和定时源(timer source),然后做回调处理。这和windows的消息处理非常类似,只不过你无法看到类似SendMessage,PostMessage,GetMessage的方法,NSRunloop已经封装了这些细节。那NSRunloop的好处是不是只有封装细节,然后方便调用呢?答

zyy的专栏 5299

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

authorware310
博客等级 码龄15年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值