delphi 协程 doroutine 取消协程、及取消回调

news/2025/1/8 10:58:56/文章来源:https://www.cnblogs.com/feng88/p/18648316

简介

协程 执行前、执行中、执行后 全部都可以被取消;

  • 执行前取消;
  • 执行中,是协程内核 优先尝试取消,并清空线程栈;若开发者内部是for循环大耗时协程,开发者自己也可以 通过 IsCancel 判断,来自己结束此协程;
  • 执行后取消是指,可能此协程衍生出来了很多子协程,这些子协程又是有 前、中、后 3个状态;子协程会连带取消;

示例代码

unit main;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls, doroutine, System.Generics.Collections;typeTForm3 = class(TForm)Button1: TButton;Button3: TButton;procedure Button1Click(Sender: TObject);procedure Button3Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm3: TForm3;n: Integer;implementation{$R *.dfm}procedure doCanceled(task: TTask);
beginif TThread.Current.ThreadID = MainThreadID thenbeginShowMessage('主线程 执行了 取消回调');end else beginShowMessage('bg线程 执行了 取消回调');end;
end;procedure bgSmall(task: TTask);
begin//doSomeThing http 请求了,或其他 后台业务Sleep(100); //模拟做事//可看下日志OutputDebugString(PChar(Format('干完了第: %d 个,后,由于被取消了,剩下的不干了!', [AtomicIncrement(n)])));
end;procedure bgBig(task: TTask);
begin//此大协程开启300个bg小协程做事for var i := 1 to 300 dobegintask.bg(bgSmall).start;end;
end;procedure TForm3.Button1Click(Sender: TObject);
begin//开启一个大协程做事,做的过程中,取消此大协程var tid := task.bg(bgBig).onCancelUi(doCanceled).start;Sleep(1000); //模拟让当前线程睡一会,让后台【线程们】执行一会,然后开始取消tasks.cancel(tid); //开始取消这个big协程,它衍生的300个小协程一并都会被取消;
end;/// <summary>
/// 一个协程内部 又使用了 for 循环,且每次循环 都有耗时操作
/// </summary>
procedure forLoopBg(task: TTask);
beginfor var i := 1 to 100 dobeginif task.isCancel thenbeginOutputDebugString(PChar(Format('循环到:%d后,我被取消了,跳出循环,退出此协程!', [i])));Exit; //退出此协程end;Sleep(100); //模拟耗时做一些事,外层是一个 for 循环end;
end;procedure TForm3.Button3Click(Sender: TObject);
begin//启动一个协程内部有 for 循环 耗时的协程;var tid := task.bg(forLoopBg).onCancelUi(doCanceled).start;Sleep(1000); //模拟让当前线程睡一会,然后开始取消tasks.cancel(tid); //开始取消
end;end.

效果图

image

留意

  1. 开发者应该尽量避免在一个协程内部,又写 【耗时】的 for/while/repeat 循环,不耗时的 for循环 你可以随便写;应该把这个耗时的循环协程,拆分成多个小协程;这个是 推荐的做法,因为这样运行效率是最高的,协程是并行的;

  2. 在耗时循环内部使用 isCancel 判断,若为 true 则退出循环,如上例里的:

    /// <summary>
    /// 一个协程内部 又使用了 for 循环,且每次循环 都有耗时操作
    /// </summary>
    procedure forLoopBg(task: TTask);
    beginfor var i := 1 to 100 dobeginif task.isCancel thenbeginOutputDebugString(PChar(Format('循环到:%d后,我被取消了,跳出循环,退出此协程!', [i])));Exit; //退出此协程end;Sleep(100); //模拟耗时做一些事,外层是一个 for 循环end;
    end;
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/862979.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI智能道路巡检养护系统

随着智慧城市建设的不断深入,城市基础设施的智能化升级已成为提升城市管理效率和居民生活质量的关键。其中,道路作为城市交通的基石,其智能化巡检养护系统的重要性日益凸显。本文将深入探讨“道路AI智能巡检养护系统”的建设内容,为智慧城市的发展提供新的思路。一、系统概…

媒体声音|专访阿里云数据库周文超博士:AI就绪的智能数据平台设计思路

在生成式AI的浪潮中,数据的重要性日益凸显。大模型在实际业务场景的落地过程中,必须有海量数据的支撑:经过训练、推理和分析等一系列复杂的数据处理过程,才能最终产生业务价值。事实上,大模型本身就是数据处理后的产物,以数据驱动的决策与创新需要通过更智能的平台解决数…

生信数据库及工具

引言 本文收藏个人生信有用的数据库和工具 数据库 OMIA OMIA是一个免费的、经过同行评审的知识库,它包含了关于动物遗传特征的信息,特别关注那些与人类疾病相似的特征。该数据库旨在促进对动物模型中遗传性状的研究。NCBI NCBI是美国国家生物技术信息中心,提供广泛的生物医学…

LINUX-安装VMware

安装VMware 通过网盘分享的文件:VMware-workstation-full-17.5.2-23775571.exe 链接: https://pan.baidu.com/s/1OUrDmdF0ROukfYRiYtfhAw?pwd=sky1 提取码: sky1 一、VMware下载 https://www.vmware.com/ 点击 Prodects二、SEE DESKTOP HYPERVISORS三、DOWNLOAD NOW四、选择V…

离线下载1.23.17版本k8s镜像、插件

1.离线部署说明 由于项目运行在内网环境,无法直接在线安装 Kubernetes,因此需要提前离线下载所需的镜像、工具和配置文件,并在内网环境中进行部署 2.纯净相同系统的服务器,下载k8s相关组件、镜像等 2.1 配置阿里云yum源 curl -o /etc/yum.repos.d/CentOS-Base.repo https:/…

onlyoffice做雷达图,比较robust control的性能

为了比较滑膜,高增益和高频率算法的性能,做如下表格,steady error converge speed Transient input Steady input序号 name Stead E Converge S Transient I Stead I1 sm 5 4 2 12 high gain 4 5 1 232 3 3 44 high freq 3 2 4 351 1 5 5数据见表格。有了数据,形成雷达图:…

Linux查看CPU相关信息 物理CPU个数、核数、逻辑CPU个数

一个物理封装的CPU(通过physical id区分判断)可以有多个核(通过core id区分判断)。而每个核可以有多个逻辑cpu(通过processor区分判断)。一个核通过多个逻辑cpu实现这个核自己的超线程技术。也就是一个物理核包含多个逻辑CPU # 总核数 = 物理CPU个数 X 每颗物理CPU的核数…

MYSQL数据库导出导入脚本.18647974

以test数据库为例:一、导出数据库 /usr/local/mysql/bin/mysqldump -uroot -p test --routines | gzip > test_250102.sql.gz二、导入数据库 gunzip < /root/test_250102.sql.gz | /usr/local/mysql/bin/mysql -uroot -p test.zstitle { width: 280px; text-align: cent…

Pycharm 2024.3安装及激活教程(附详细步骤和常见问题解答,激活至2099,亲测)

前言 Pycharm 是 JetBrains 公司推出的一款强大的Python集成开发环境(IDE),本文为大家提供最详细的安装、激活教程,帮助您快速配置开发环境。文末附激活补丁获取方式及常见问题解决方案。1. 卸载旧版本 Pycharm 如果电脑中已安装旧版本Pycharm,请先彻底卸载: 注意事项:如…

docker-compose安装nexus

拉取镜像 下载地址 https://hub.docker.com/r/sonatype/nexus3docker pull sonatype/nexus3 创建持久化目录 ` mkdir /data/nexus chmod 777 /data/nexus ` yml version: 3 services:nexus:restart: alwaysimage: 192.168.1.223:10242/base/sonatype/nexus3:latestcontainer_na…

新春狂欢,超市管理新升级:看板软件引领高效运营!

看板软件在零售超市门店新春管理中具有显著的应用价值和优势。通过合理利用看板软件,门店可以更加高效地管理库存、销售、员工和顾客服务等方面的工作,提升运营效率和顾客满意度。零售超市门店在新春期间面临着各种运营挑战,包括库存管理、销售促进、员工调度和顾客服务等方…

1.1 可压缩流:等熵流动

冲刺冲1.1 可压缩流:等熵流动 热力学复习 理想气体:认为分子间的碰撞是弹性的,没有热、动量损失。 \[\begin{equation}p=\rho RT\end{equation} \]内能:给定体积内所有分子包含能量的总和。 比内能(内能/质量)e与比焓h: \[\begin{equation}h=e+pv\end{equation} \]这里p…