并发 (三):Group Dispatch and DIY Dispatch

本文介绍如何利用GCD(Grand Central Dispatch)的任务组(dispatch_group)确保多个任务按顺序执行,并通过示例展示了如何创建串行队列来控制任务的执行顺序。

将GCD任务集合起来

目的:将代码块集合到一起,确保他们在GCD机制下,一个接一个的执行,就像是相互依靠。
解决方法:dispatch_group_create 来建立集合

先了解下Group的四个方法:

  1. dispatch_group_create
  2. dispatch_group_async
  3. dispatch_group_notify
  4. dispatch_group_release

1和4搭配使用,2要指定调度队列,3是允许你在添加到group中的所有任务执行完之后,汇总再执行别的任务。

实例:有三个方法我们想依次调用,都调用完了,然后再给用户一个提示信息。

 dispatch_group_t taskGroup = dispatch_group_create();
    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    dispatch_group_async(taskGroup, mainQueue, ^{
        [self reloadTableView];
    });
    dispatch_group_async(taskGroup, mainQueue, ^{
        [self reloadScrollView];
    });
    dispatch_group_async(taskGroup, mainQueue, ^{
        [self reloadImageView];
    });
    dispatch_group_notify(taskGroup, mainQueue, ^{
        /**
         *  自己随便写点什么提示消息吧
         */
    });

    dispatch_release(taskGroup);//ARC下可以省略

C函数实现方法:略,不想写了

创建你自己的GCD调度队列

这样创建的是serial queue(串行队列),它将会用到:
dispatch_queue_create、dispatch_release、dispatch_async
其中create方法的第一个参数是一个C的字符串类型char*,第二个参数为0。
而dispatch_async在这里使用的原因是:dispatch_sync是FIFO原则执行,而一个队列上的并发任务不会在主线程上执行,这个机制可以令串行队列更加高效。


dispatch_queue_t firstSerialQueue =
dispatch_queue_create("com.company.product.serialQueue1", 0);

dispatch_async(firstSerialQueue, ^{
    NSUInteger counter = 0;
    for (counter = 0; counter<5; counter++) {
        NSLog(@"First iteration, counter = %lu",(unsigned long)counter);
    }
});

dispatch_async(firstSerialQueue, ^{
    NSUInteger counter = 0;
    for (counter = 0; counter<5; counter++) {
        NSLog(@"Second iteration, counter = %lu",(unsigned long)counter);
    }
});

dispatch_async(firstSerialQueue, ^{
    NSUInteger counter = 0;
    for (counter = 0; counter<5; counter++) {
        NSLog(@"Third iteration, counter = %lu",(unsigned long)counter);
    }
});

dispatch_release(firstSerialQueue);//ARC下不需要

打印出来的结果是

First iteration, counter = 0
First iteration, counter = 1
First iteration, counter = 2
First iteration, counter = 3
First iteration, counter = 4
Second iteration, counter = 0
Second iteration, counter = 1
Second iteration, counter = 2
Second iteration, counter = 3
Second iteration, counter = 4
Third iteration, counter = 0
Third iteration, counter = 1
Third iteration, counter = 2
Third iteration, counter = 3
Third iteration, counter = 4
源码链接: https://pan.quark.cn/s/a4b39357ea24 在网页构建领域中,CSS3(层叠样式表第版)为程序员们提供了多样化的视觉表现手法和用户交互功能。在此案例中,我们聚焦于一种普遍的用户交互设计——"CSS3鼠标指针停留在图片上时的放大效果",即当用户将鼠标光标移动至图片上时,图片会自动进行放大,从而增强了用户的参与度和视觉冲击力。此类效果经常应用于商品展示或图像预览环节,有助于提升网站的整体用户体验。 我们需要掌握HTML5中的`<img>`标签,它是用于嵌入图像的基本组件。在`<img>`标签内部,我们可以通过`src`属性来设定图像的地址,`alt`属性用于在图像无法加载时提供替代说明文字,此外还包括`width`和`height`属性用于设定图像的尺寸。 ```html <img src="image.jpg" alt="图片的说明文字" width="200" height="200"> ``` 构建图片在鼠标悬停时放大这一功能的关键在于CSS3的`:hover`伪类选择器。`:hover`用于选取鼠标光标悬停其上的元素,结合transform属性,我们可以便捷地实现图片的放大操作。以下是一个基础的示例: ```css img { transition: transform 0.3s ease; /* 引入过渡效果 */ } img:hover { transform: scale(1.2); /* 鼠标悬停时,图片放大到原尺寸的120% */ } ``` 在这段代码里,`transition`属性设置了图像在变化过程中的过渡效果,`0.3s`代表过渡持续的时间,`ease`是预设的缓动效果,使得变化过程更加流畅。`...
内容概要:本文系统研究了基于最优滑模控制的永磁同步电机(PMSM)调速系统模型,并通过Simulink平台实现了完整的仿真实验。研究聚焦于滑模控制在电机调速中的应用,重点对比了经典滑模、改进滑模与最优滑模种控制策略的性能差异,深入分析了最优滑模控制在提升系统动态响应速度、增强抗干扰能力及改善稳态精度方面的优势。文章详细阐述了电机数学建模、控制器设计、稳定性分析与仿真验证全过程,突出了最优滑模控制在有效抑制抖振现象、提高系统鲁棒性方面的关键技术特点。; 适合人群:具备自动控制原理、电机控制理论基础及Simulink仿真技能的电气工程、自动化、控制科学与工程等相关领域的研究生、科研人员以及从事高性能电机驱动系统开发的工程技术人员。; 使用场景及目标:①为高等院校和科研机构开展先进电机控制算法的教学与科研工作提供理论依据和仿真案例;②为工业界高性能伺服系统、新能源汽车电驱动系统等领域的控制器设计提供技术参考与验证手段;③帮助研究人员深入掌握滑模控制的设计方法、参数整定技巧及其在实际工程系统中的实现路径。; 阅读建议:建议读者结合提供的Simulink模型进行同步操作与仿真,重点关注不同滑模控制器的结构设计与参数设置,通过对比仿真结果直观理解最优滑模控制的优越性。同时,可在此基础上探索将最优滑模控制与自抗扰、预测控制等先进控制理论相结合,进一步拓展其在复杂非线性系统中的应用研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值