swish

QDAC项目主要开发人员

[教程]ZAsync 异步编程教程之七:在后台线程中 async/await

在上一节中,我们做了一个简单的 async/await 的例子,这一节我们继续对其进行更详细的解析。 前面我们已经说过,async/await 模式是一种协同式的多任务执行机制,要求处理代码在等待一个操作时(如磁盘IO、网络IO等),显式调用对应的接口(对于 ZAsync ,为 TZAsync.Yield)。否则使用

[教程]ZAsync 异步编程之四:关于匿名函数和线程变量

[匿名函数] 在 Delphi 中,匿名函数实际上是一个接口,这一点我们在前面的文章中已经做出了明确的提示。从前面的分析我们可以看出: 1、在匿名函数中使用的局部变量,实际内存是对应的结构成员的位置,而不是当前函数栈上的位置。 2、如果一个接口局部变量被匿名函数引用,那么应该在用完后,设置为空,以便减小引用计数,避免内

[教程]ZAsync异步编程之五:IZAsyncInvoker的执行链条

ZAsync 简化了异步编程模型的设计,做了以下强制约定: 异步作业执行可以在主线程或后台线程中执行 异步作业执行函数退出后的操作,如果是用 async/await 调用,则其在原线程中执行,而其它后台线程的异步作业,只能在主线程中运行,以方便访问主线程界面元素,减少出错的几率。 为了方便大家了解 ZAsync 异步编

[教程]ZAsync 异步编程之三:我们对异步编程的一些观点

异步编程对于开发人员来说,实际上是一个又爱又恨的东西,用好了很舒服,用不好很麻烦。异步编程中,异步操作代码的本身是在一个后台线程或当前线程中延迟调用。而大家说异步编程的几种不同的处理方式,实际上是指对异步处理完成后,如何处理后续的步骤,本质上都是回调处理函数,但操作各有不同: 直接设置回调函数 订阅机制:订阅异步作业通

[教程]使用 TZAsync 进行异步编程教程之二:TZAsync 解决了什么问题

在上一节教程的例子中,我们演示了一个简单的异步编程的例子。 我们请大家首先阅读 Delphi 自带的异步编程模型,那么它存在的问题: 生命周期问题: 没有和现有的组件体系结合,如果 BeginInvoke 引发的异步调用,返回回调时异步作业的创建者被释放,那么如果我们在其中访问创建者相关的实例,就有可能出现问题。 异步

[异步编程] 使用 ZAsync 进行异步编程教程之一:Hello,world

ZAsync 是由吉林省左右软件开发有限公司开发的一套异步编程框架,目标是用来简化异步编程模型。 在异步编程时,我们要解决几个问题: 1、异步操作的生命周期: 开启一个异步操作 在后台执行异步操作 异步操作执行完成 回调通知异步执行结果 异步操作结束清理释放 2、异步参数传递: 参数的生命周期管理 参数值修改问题 3、

[流控] ZFlowControler 设计基本思想说明

首先,说一下支持的流控种类: 基于时间分片的流控,限制每分钟允许发生多少次调用。这种情况下的流控,对一段时间内的速度控制,一般分成两种: 均一化流控:将速度均匀分布,比如说我们限制某个访问为每分钟1200次,那么程序控制粒度就是在每50ms,允许调用一次。 爆发式流控:同样是上面的要求,爆发式的流控会拿出一部分限额,尽

[教程]本用 System.Zip 从流中获取解压数据

【前言】 写这个教程的原因,是因为要实现下面的场景: 1、通过 THttpClient 从网络上下载压缩包到内存流中。 2、将内存流中的 ZIP 格式压缩数据中的特定扩展名文件,在内存中直接解压处理,而不是解压到磁盘,再加载。 【实现流程】 1、下载压缩包到内存流中,这个本身直接通过 THttpClient.Get 或

[教程] Delphi 自带异步模型详解

Delphi 在新版中引入了一个新的异步编程模型,一个新的接口 IAsyncResult 被包含在 System.Types 里。我们先来大概说下 Delphi 自己这个异步编程模型的思路: 1、异步编程的函数名,官方是以 BeginXXX打头,比如 BeginReceive、BeginWrite 等等 ,它们负责开始

[更新说明]RAD Studio 11.1 更新内容简译

原文链接 IDE IDE 做了一些改进,优化了视觉和操作体验(包含欢迎页、新建工程、项目管理、DPI处理、GetIt等),另外集成了 IDE Fix Pack 的少部分功能。 编译器 ASLR、DEP/NX和TSAWARE支持 C++ 编译器和工具链做了重大改变,以住的库在新版本需要重新编译才能使用,RTL做了许多增强

[转]ESXi找回并重新挂载丢失的数据存储

文章来源:在下天锦 是在一张1TB的硬盘上安装了ESXi系统,并且默认建立了一个VMFS6的数据存储datastore1。开学后从家带到学校换到了另一台物理机上面,发现网络出现故障,Ping不通主机,随即尝试重置管理网络,不料将整个系统重置……网络是恢复了,能够进到Web Client,但是发现系统中的数据存储全部丢失

[教程]Lazarus 在 Linux 下中文输入法问题的临时解决办法

这个真的很临时,Lazarus 中文输入法的本质问题是其代码编辑窗口使用的SynEdit控件在 Linux 操作系统下的处理逻辑问题。目前可以通过以下步骤解决不能输入的问题: 1、进入工具菜单中的配置构建 Lazarus 选项。 2、在弹出的对话框中,选择目标操作系统 Linux,目标 CPU x86_64。 3、选择

[教程]Delphi 中的匿名函数详解

Delphi 支持匿名函数已经很久了,在以前的文章中,我说过,Delphi 的匿名函数实际上是一个接口,当然这个接口是没有接口的GUID的。那么 Delphi 是如何动态生成这个接口类型的呢?我们以一个实际的例子和接口在内存中的布局来详细说明下: 1、首先,接口三大金刚(AddRef/Release/QueryInte

[教程]程序保存数据的防断电处理策略

虽然现代社会,电力供应没有那么紧张,但每年因为线路或计划检修等原因,正常和非断电的情况还是有的。另外,室内电源接触不良,掉落等因素也会出现异常断电的情况。如果在此时,恰好数据写入一半,就可能造成程序数据写入异常,下次程序启动时,如果调用这种数据就可能出现某些非预期的错误。 实际上解决这类问题,有一个简单的策略: 1、将

[付费]数据集内容输出 JSON 格式数据

嗯,这是一个试验性的收费产品,它是做为 TQJsonOutputChannel 的附属品存在的,信赖于 qjson_output_channel 单元,提供数据集转换为 JSON 数据内容的格式化输出支持。收费标准定为 200 元,含源码、示例和用法一对一指导。 【使用方法】 一如既往的简单,直接引用 qjson_da

[教程]使用 TQJsonOutputChannel 写入 JSON 数据到流中

TQJsonOutputChannel 的主要作用是用来快速写入大型的 JSON 数据到文件中,所以整体是面向写入过程设计的,不要试图用它来控制内容的修改。 假设我们要将数据内容写入到目标数据流 AStream 中: 第一步:我们需要定义一个 IQJsonStreamEncoder 的实例,它是一个结构体,所以直接在栈