消息循环NSRunLoop

【多线程-第二天-子线程的消息循环 Objective-C语言】 阅读详情

NSRunLoop (消息循环)
RunLoop就是消息循环,每一个线程内部都有一个消息循环。
只有主线程的消息循环默认开启,子线程的消息循环默认不开启。

NSRunLoop的作用
1,保证程序不退出
2.负责处理输入事件
3.如果没有事件发生.会让程序进入休眠状态

事件源 : input Sources 输入源
Timer Source 定时源

消息循环使用
1.创建输入源(定时源)
2.指定事件源再循环中运行的模式.并加入循环

//创建时间源
  NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(task) userInfo:nil repeats:YES];

  //定时源加到消息循环中去
   [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

循环的模式 (只有当消息模式 与循环的模式 匹配的时候,消息运行)
 // NSDefaultRunLoopMode 默认模式下,拖动界面,计时器停止  最常用的循环模式
 // NSRunLoopCommonModes 多模式的状态,拖动界面,不影响计时器工作 一组模式的集合

 // 消息循环时模式
  // kCFRunLoopDefaultMode 定时器工作的模式(默认模式)
  // UITrackingRunLoopMode 拖动界面时的模式

1.创建消息
2.把消息放入循环,并指定消息运行的模式
3.在与循环的模式匹配的时候,消息运行

特点:子线程默认不开启消息循环,主线程默认开启消息循环。
子线程的 RunLoop默认是不开启的,而且不可以轻易开启,如果开启会形成死循环,然后不停地检测是否有事件发生,因此开启子线程的消息循环之后一定要关闭,防止程序挂掉,

子线程中的消息循环

 //开启子线程的消息循环
  //第一种方法 .无法停止
  //    [[NSRunLoop currentRunLoop] run];
  //第二种方法 .制定循环运行时间,
  [[NSRunLoop currentRunLoop]
      runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
  //第三种方式 推荐方式
  //将shouldKeepRunning定义为全局的变量,并且设置为NO
  //  BOOL shouldKeepRunning = YES; // global
  NSRunLoop *theRL = [NSRunLoop currentRunLoop];
  NSLog(@"%d", shouldKeepRunning);
  while (shouldKeepRunning &&
         [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

NSRunloop与autorelease pool
在主线程消息循环开始的时候创建自动释放池,在消息循环结束的时候,销毁释放池,
在循环过程中创建的临时对象,会自动添加到释放池中,在循环结束后会向池中所有对象发送 release 消息,释放所有 autorelease 对象,以减少内存消耗;
NSThread开启子线程的时候要自己创建自动释放池,否则会发生内存泄露

PaddleOCR在医疗票据识别中的实战:从部署到业务字段提取 本文详细介绍了PaddleOCR在医疗票据识别中的实战应用,重点阐述了其离线部署方案与PP-OCRv3模型选型优势。针对医疗票据敏感数据不出本地的合规要求,文章提供了从环境搭建、模型配置到核心字段提取策略的完整流程,并分享了性能优化与系统集成的实践经验,有效解决了医疗票据自动化录入的难题。 阅读详情

相关推荐

Eplan2022 复制已有的宏文件生成新的原理图宏文件

Eplan2022 新建原理图宏文件

haier123888的博客 1万+

个人对RunLoop的见解

RunLoop–运行环 RunLoop的基本作用 保持程序的持续运行 处理app中的各种事件(比如触摸事件,定时器事件,selector事件) 节省CPU资源,提高程序性能:该做事的时候做事,该休息就休息 main函数中的RunLoop UIApplication函数内部就启动了一个RunLoop 这个Runloop主线程的,默认是开启的,子线程的RunLoop默认是关闭的 每条线程都有唯一

LoSenTrad 1043

SAP公司间采购后台配置及前台操作详解

公司间采购后台配置及前台操作详解 SAP 实施中公司间交易几乎每个项目都会有此业务需求,比如内地很多公司都会在香港设置贸易型子公司。通过香港公司接单,然后转内地公司生产,或内地公司通过香港公司采购进口原材料,这些业务必然会涉及到公司间交易,下面我将详细说明下SAP是如何实现这种业务场景的,供大家参考。 配置前必须前台先创建公司间供应商主数据和客户主数据 1. 创建相应的客户主数据 功能说明 公司间...

weixin_40672823的博客 1万+

AUTOSAR的运行流程

以EB产品提供的demo为例,执行完EcuM_StartupTwo后,会初始化各个模块(例如通信协议栈模块,状态管理模块,内存管理模块等),并请求BswM进入到Startup Two A的状态。从EcuM的角度来说,ECU已经是运行状态,然而,接下来还会由BswM模块进行模式仲裁以及更多的BSW模块初始化,启动RTE,开始运行SWC。首先,需要启动BSW调度表,然后初始化BswM模块,初始化BSW调度表,最后开启调度表计时器,开始执行BSW或者SWC的周期事件。

PlutoZuo的博客 2856

python爬取《你好, 李焕英》豆瓣评论数据

# 导入工具包 import requests from bs4 import BeautifulSoup import time import pandas as pd import numpy as np # 请求头 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'} # =

python技巧分享 3457

ESP-IDF 5.4下esp32-camera组件编译报错?手把手教你解决头文件缺失问题

本文详细解析了ESP-IDF 5.4环境下esp32-camera组件编译时出现的头文件缺失问题,提供了从目录结构优化、CMake配置到VSCode智能感知设置的完整解决方案。针对第三方组件集成难题,文章特别强调了PRIV_REQUIRES依赖声明和路径配置的关键作用,帮助开发者高效解决编译错误并建立稳定的开发环境。

weixin_28829629的博客 309

使用WNTR生成数据完成LSTM预测时间数据数据集的准备工作

我们在预测用水量、节点压力的数据时,不仅仅只针对原始的时间序列数据,还要考虑特定时间点的特性。 根据专业知识,对用水压力进行预测。 1.用户用水的周期性,由于工作生活的高度规律性,大部分用户是白天上班,用水高峰在早上起床的洗漱、下班回家做饭、晚间洗漱等三个较为固定的时间段。呈现出三个波峰,晚间凌晨低谷的用水曲线。 2.并且还随着温度,区域人口的增长等有一种趋势的叠加状态。 于是,我们按照往日数据进行预测的时候,不能仅仅考虑预测时间点当日的用水因素,还应该考虑在较长的时间段内的用水趋势变化。 在以往的博文中,

wenxiaoshuai001的博客 1557

企业数字化转型的 4A 架构指南:从概念解读到 TOGAF 阶段对应

4A企业架构是中国数字化转型实践中总结的简化框架,包含业务、应用、数据和技术四个架构层。它自上而下形成业务驱动应用的指导关系,自下而上构建技术支撑数据的实现路径,与国际标准TOGAF核心内容高度对应。该模型通过统一语言、战略对齐和系统梳理,有效连接业务需求与IT实施,已成为企业架构规划的实用工具。其分层结构清晰展示了从业务目标到技术落地的完整推导链,特别适合中国企业的数字化转型场景。

友莘居士的博客 2176

【iOS程序启动与运转】- RunLoop个人小结

作者:楚天舒 授权本站转载。 学习iOS开发一般都是从UI开始的,从只知道从IB拖控件,到知道怎么在方法里写代码,然后会显示什么样的视图,产生什么样的事件,等等。其实程序从启动开始,一直都是按照苹果封装好的代码运行着,暴露的一些属性和方法作为接口,是让我们在给定的方法里写代码实现自定义功能,做出各种各样的应用。这些方法的调用顺序最为关键,熟悉了程序运转和方法调用的顺序,才可以更好地操控程序和

qq_16379603的博客 803

总结所有的池化(Pooling)方法

为什么池化? 池化(Pooling)层和卷积层、全连接层一样,都是卷积神经网络的组成部分。 卷积神经网络中的卷积层会将卷积Filter应用于输入图像,以便创建特征映射来总结输入中这些特征的存在。 卷积层被证明是非常有效的,在深层模型中叠加卷积层可以让接近输入的层学习低层特征(如线条),在模型中更深(高)的层用于学习高阶或者更抽象的特征,如形状或特定对象。 卷积层特征映射输入的一个局限性是它们只能精确记录特征在输入层的位置。这意味着在输入图像中特征位置的小幅移动将导致不同的特征映射。这可以随着重新裁剪

大脸猫的博客 1万+

基于BP神经网络PID控制的电机转速控制器设计复现

摘要:本文提出了一种基于BP神经网络PID控制的永磁同步电机转速控制方法,通过MATLAB/Simulink平台实现了算法复现。系统采用三层BP神经网络在线调整PID参数,包含输入层(误差、误差变化率、误差积分)、5节点隐含层和输出层(Kp、Ki、Kd)。仿真结果表明,相比传统PID控制,该方案具有更快的响应速度(上升时间减少约40%)、更小的超调量(降低约60%)和更强的抗干扰能力,在电动汽车电机驱动等复杂工况下表现优异。文中详细给出了PMSM数学模型建立、BP网络设计、权值更新算法及Simulink仿真

max500600的博客 308

Oracle/PLSQL FOR Loop

Oracle/PLSQL FOR Loop

fdyufgf的博客 1088

路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真)

图解A*、Dijkstra、GBFS算法原理,分析三种算法异同,提供C++/Python/Matlab仿真实现

FRIGIDWINTER的博客 2万+

NSRunLoop消息循环

自动释放池 当主线程的消息循环开始的时候会先创建自动释放池 消息循环结束前,会释放自动释放池 NSRunLoop消息循环 每一个线程内部都有一个消息循环 只有主线程的消息循环默认开启,子线程的消息循环默认不开启 子线程的消息循环开启:[[NSRunLoop currentRunLoop]run] 需注意,对于线程而言,开启后的线程永不销毁,使用结束会保存到线程缓存池中

DrankMouse 419

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

NSRunLoop( 消息循环 )

1. 什么是RunLoop? 就是消息循环,每个线程内部都有一个消息循环; 主线程默认开启消息循环, 子线程默认不开启; 2. RunLoop的目的? 保证程序不会退出; 负责处理事件; 如果没有事件发生, 会让程序进入到休眠模式;

iOS_ZJQ的博客 587

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

NSRunLoop 对象

(摘自《苹果开发之cocoa编程》原话) “NSRunLoop对象专司等待。它等到事件抵达,然后把事件中转给NSApplication;它等待timer事件,然后把事件中转给NSTimer。 甚至可以附加一个网络socket到循环中,然后它就会等待那个socket上数据的抵达。”  说白了就是消息循环么,消息中转站。

活着就为改变世界 1544

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

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

zyy的专栏 5300

ios超精细详解之NSRunLoop

我们首先来了解一下什么是NSRunLoop 1.NSRunLoop是IOS消息机制的处理模式 NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠。 2.NSRunLoop 就是一直在循环检测,从线程start到线程end,检测inputsource(如点击

wangyongiii的博客 436

NSRunLoop 概述和原理

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

zerocnd的专栏 1257

NSRunLoop方法使用及使用场景

+ (NSRunLoop *)currentRunLoop; //获得当前线程的run loop+ (NSRunLoop *)mainRunLoop; //获得主线程的run loop- (void)run; //进入处理事件循环,如果没有事件则立刻返回。注意:主线程上调用这个方法会导致无法返回(进入无限循环,虽然不会阻塞主线程),因为主线程一般总是会有事件处理。- (void)runUntilD...

zhouleizhao的专栏 4618

iOS NSRunLoop

NSRunLoop就是一个事件处理循环,用来不停的监听和处理输入事件并将其分配到对应的目标上进行处理。 首先,NSRunLoop是一种更加高明的消息处理模式,他就高明在对消息处理过程进行了更好的抽象和封装,这样才能是的你不用处理一些很琐碎很低层次的具体消息的处理,在NSRunLoop中每一个消息就被打包在input source或者是timer source中。它还可以处理使线程阻塞的工作。

IosScholar 586

iOS巅峰之NSRunLoop

我们首先来了解一下什么是NSRunLoop 1.NSRunLoop是IOS消息机制的处理模式 NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠。 2.NSRunLoop 就是一直在循环检测,从线程start到线程end,检测inputsource(如点击

qw656567的博客 373

NSRunloop 简单细说

NSRunloop简单细说(一)—— 整体了解NSRunloop简单细说(二)—— 获取运行循环及其模式NSRunloop简单细说(三)—— 定时器和端口NSRunloop简单细说(四)—— 开启RunloopNSRunloop简单细说(五)—— 调度和取消消息NSRunloop简单细说(六)—— 几种循环模...

weixin_33811961的博客 101

NSRunLoop的进一步理解

NSRunLoop的进一步理解 2011-8-22 15:42| 发布者: Vincent| 查看: 716| 评论: 17|原作者: iGoogle 摘要: 本文基于一篇网络文章,加入了一些自己的理解,希望对大家有所帮助 iPhone应用开发中关于N

huangbaoyu1840的专栏 1176
上一篇: 沙盒文件存储
下一篇: Block的循环引用
Step_Next
博客等级 码龄11年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值