iOS多线程使用总结

//获得主线程:

[NSThread mainThread];

{number=1, name=main}


//获得当前线程:

[NSThread currentThread];


//判断是否主线程:

[NSThread ismainThread];(BOOL)

或者

[[NSThread currentThread] ismainThread];(BOOL)


//pThread使用:(C实现,跨平台,头文件#include<pThread.h>)

pthread_t thread;

pthread_create(&thread, attributeOfThread, func, funcPara);


//NSThread使用:

NSThread * thread = [[NSThread alloc] initWithTraget:self selector:@seletor(run:) object:runPara];

[thread start];

(创建新线程,run执行完成自动销毁线程)

或者

[NSThread detachNewThreadSeletor:@seletor(run:) toTarget:self withObject:runPara];

(分离子线程)

或者

[self performSeletorInBackgroud:@seletor(run:) withObject:runPara];

(开启后台线程)


阻塞线程:

[NSThread sleepForTimeInterval:(float)];

[NSThread sleepUntilDate:[NSDate dateWithIntervalSinceNow:3.0]];


推出线程:(销毁线程否?)

[NSThread exit];



//原子属性和非原子属性:

atomic:会对setter方法加锁;

nonatomic:不会为setter加锁;


//线程间通信:

-(void)performSelectorOnMainThread:(SEL)aSeletor withObject:(id)arg waitUntilDone:(BOOL)wait;

-(void)performSeletor:(SEL)aSeletor onThread:(NSThread*)the withObject:(id)arg waitUntilDone:(BOOL)wait;


//GCD基本使用:(所有函数都以dispatch_开头,并且使用C语言的形式)

//创建队列:

dispatch_queue_t queue = dispatch_queue_create(char * label , 宏);

其中宏的值有(即队列的类型):

DISPATCH_QUEUE_CONCURRENT (并发)

DISPATCH_QUEUE_SERIAL (串行)


//封装异步任务block到并发queue队列中:

dispatch_async(queue , block); (并发队列)

会开启新线程,并且异步执行


//封装异步任务block到串行queue队列中:

dispatch_sync(queue , block); (串行队列)

也会开启线程,但只开启一个线程,串行执行


//封装同步任务block到并发queue队列中:

//封装同步任务block到串行queue队列中:

dispatch_async(queue , block); (并发队列)

dispatch_sync(queue , block); (串行队列)

都不会开启线程,在主线程中串行执行


//另外,通过调用函数(不是block)封装任务:

dispatch_async(queue , context, Cfunc);


//全局并发队列:(获得已经有的队列)

dispatch_get_global_queue(优先级,给未来用默认为0);

其中优先级有:DISPATCH_QUEUE_PRIORITY_BACKGROUND

                     DISPATCH_QUEUE_PRIORITY_DEFAULT

                     DISPATCH_QUEUE_PRIORITY_LOW

                     DISPATCH_QUEUE_PRIORITY_HIGH

(优先级由低到高的顺序)


//主队列:凡是在主队列中的任务,都会放到主线程中执行!

//创建:

dispatch_queue_t queue = dispatch_get_main_queue();

⚠️注意:千万不要在主线程中把同步函数添加到主队列中,会发生死锁!

⚠️总结:

(1)并发队列中只能放异步任务;而串行队列可以放异步或同步任务。

(2)同步函数会阻塞当前线程,异步函数不会阻塞当前线程

(3)如果在主线程中,同步函数因为阻塞了主线程,这样就不能去创建新线程,但又有新的队列要去执行,因此就由主线程来串行执行,所以这个时候如果把这个任务加到主队列中,会产生死锁;如果不在主线程中,同步函数只会阻塞当前线程,而因为主线程还在空闲,所以可以调度主线程来执行这些任务


//GCD线程通信:

创建线程后想回到主线程时,通过嵌套把想要在主线程中执行的代码放到主队列中即可!


//延迟执行操作以及GCD延迟的优势:

1.[self performSeletor:@seletor(task) withObject:nil afterDelay:seconds];

2.[NSTimer scheduledTimerWithTimeInterval:seconds target:self selector:@selector(task) userInfo:nil repeats:是否重复]; 

3.dispatch_after(dispatch_time{相关时间信息},要放入的队列,^{要执行的代码});

GCD优势时可以决定延迟过后在哪个线程执行block里的代码


//GCD实现一次性代码:

这种一次性指的是这段代码在整个程序运行期间只会执行一次;而懒加载是指对于某一对象而言,只会加载一次



//iOS RunLoop:

//iOS中有2套框架:NSRunLoop(OC,底层是CFRunLoopRef)和CFRunLoopRef(C)


//CFRunLoop的运行模式叫CFRunLoopModeRef,mode包含source,timer和observer

mode的类型有:(前两种较常用)

1)kCFRunLoopDefaultMode:默认mode,主线程默认在这个模式下运行

2)UITrackingRunLoopMode:界面跟踪mode,触摸滑动时切换到这种模式下

3)UIInitializationRunLoopMode:App启动时的mode,启动完成就不再使用

4)GSEventReceiveRunLoopMode:接受系统事件的内部mode,通常用不到

5)kCFRunLoopCommonMode:占位mode(使事件不受mode切换影响!


资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在机器人技术中,轨迹规划是实现机器人从一个位置平稳高效移动到另一个位置的核心环节。本资源提供了一套基于 MATLAB 的机器人轨迹规划程序,涵盖了关节空间和笛卡尔空间两种规划方式。MATLAB 是一种强大的数值计算与可视化工具,凭借其灵活易用的特点,常被用于机器人控制算法的开发与仿真。 关节空间轨迹规划主要关注机器人各关节角度的变化,生成从初始配置到目标配置的连续路径。其关键知识点包括: 关节变量:指机器人各关节的旋转角度或伸缩长度。 运动学逆解:通过数学方法从末端执行器的目标位置反推关节变量。 路径平滑:确保关节变量轨迹连续且无抖动,常用方法有 S 型曲线拟合、多项式插值等。 速度和加速度限制:考虑关节的实际物理限制,确保轨迹在允许的动态范围内。 碰撞避免:在规划过程中避免关节与其他物体发生碰撞。 笛卡尔空间轨迹规划直接处理机器人末端执行器在工作空间中的位置和姿态变化,涉及以下内容: 工作空间:机器人可到达的所有三维空间点的集合。 路径规划:在工作空间中找到一条从起点到终点的无碰撞路径。 障碍物表示:采用二维或三维网格、Voronoi 图、Octree 等数据结构表示工作空间中的障碍物。 轨迹生成:通过样条曲线、直线插值等方法生成平滑路径。 实时更新:在规划过程中实时检测并避开新出现的障碍物。 在 MATLAB 中实现上述规划方法,可以借助其内置函数和工具箱: 优化工具箱:用于解决运动学逆解和路径规划中的优化问题。 Simulink:可视化建模环境,适合构建和仿真复杂的控制系统。 ODE 求解器:如 ode45,用于求解机器人动力学方程和轨迹执行过程中的运动学问题。 在实际应用中,通常会结合关节空间和笛卡尔空间的规划方法。先在关节空间生成平滑轨迹,再通过运动学正解将关节轨迹转换为笛卡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值