当ADO开始处理数据后,应用程序必须等到ADO处理完毕之后才可以继续执行。但是除了同步执行方式之外,ADO也提供了异步执行的方式,允许当ADO处理时,应用程序仍然能够先继续执行。而当ADO处理数据完毕之后,ADO会以事件的方式通知应用程序,此时应用程序可以再根据ADO执行的结果来采取相应的动作。使用异步执行方式有许多用途,例如,如果应用程序需要处理花费大量时间的动作,那么ADO可以选择以异步执行方式让ADO在后台执行,而让应用程序继续处理图形用户接口或用户输入的数据。
在ADO中使用异步执行方式非常简单,只需要对ADO数据集的ExecuteOptions属性值进行适当的设定即可。现在就让我们以一实际的范例应用程序来说明如何让ADO以异步的方式来处理数据。

下载
1)在Delphi集成开发环境中关闭所有的项目。
2)建立一个新的应用程序项目,在主窗体中放入TADOConnection对象连接到
数据库。
3)在主窗体中放入TADODataSet组件。设定它的Connection属性值为步骤2)的
TADOConnection,并且在它的CommandText属性值中使用Select*fromADOTestDatas
以取得所有的数据。再设定它的Active属性值为True以打开范例数据表。
4)放入TDataSource组件,设定它的DataSet属性值为步骤3)加入的TADODataSet
组件。
5)放入TDBNavigator和TDBGrid组件,设定它们的DataSource组件为步骤4加
入的TDataSource组件。
6)在主窗体中放入两个TButton组件以及一个TProgressBar组件,并且设定它
的相关属性值。此时主窗体如图3-12所示。
图3-12范例应用程序的主窗体
7)最后在主窗体中放入一个TADOCommand组件。设定它的Connection属性
值为步骤2)的TADOConnection,并且在它的CommandText属性值中使用Select
count(*)fromADOTestDatas以便从ADOTestDatas数据表中取得所有数据的笔数。
8)在主窗体的OnActivate事件处理程序中撰写如下的程序代码:

第3章撰写使用ADO技术的应用系统(二)111
下载
procedureTForm1.FormActivate(Sender:TObject);
var
sRecNo:String;
begin
ProgressBar1.Max:=ADOCommand1.Execute.Fields.Item[0].Value;
sRecNo:=IntToStr(ProgressBar1.Max);
Self.Caption:='共有'+sRecNo+'笔数据';
end;
OnActivate事件处理程序首先执行TADOCmmand的SQL命令,并且从它回传
的暂时Recordset对象中取出ADOTestDatas数据表中所有数据的笔数,然后再指定
给TProgressBar的Max值,最后指定给窗体的Caption属性值。
9)双击窗体中的eoAsyncFetchNonBlocking按钮,并且在它的OnClick事件处
理程序中撰写如下的程序代码:
procedureTForm1.Button2Click(Sender:TObject);
begin
try
ADODataSet1.Active:=False;
ADODataSet1.ExecuteOptions:=[eoAsyncFetchNonBlocking];
finally
lStart:=GetTickCount;
ADODataSet1.Active:=True;
end;
end;
在上面的程序代码中先关闭步骤3)的TADODataSet,再设定它的ExecuteOptions
属性值为使用异步方式来存取数据。最后再打开步骤3)的TADODataSet组件,从
ADOTestDatas数据表中取得数据。
10)双击窗体中的eoAsyncFetch按钮,并且在它的OnClick事件处理程序中撰
写如下的程序代码:
procedureTForm1.Button1Click(Sender:TObject);
begin
try
ADODataSet1.Active:=False;
ADODataSet1.ExecuteOptions:=[eoAsyncFetch];
finally
lStart:=GetTickCount;
112Delphi5.xADO/MTS/COM+高级程序设计篇
下载
ADODataSet1.Active:=True;
end;
end;
在上面的程序代码中先关闭步骤3)的TADODataSet,再设定它的ExecuteOptions
属性值为使用同步方式来存取数据,再打开步骤3)的TADODataSet组件,从
ADOTestDatas数据表中取得数据。
在异步方式中,ADO会以OnFetchProgress事件来通知应用程序ADO还在处理
数据之中,并且以OnFetchComplete事件来通知应用程序ADO已经处理数据完毕了。
程序员可以在这两个事件处理程序中撰写程序代码来处理这两种情形。下面是范
例应用程序在这两个事件处理程序中实现的程序代码。

11)在步骤3)的TADODataSet组件的OnFetchProgress事件处理程序中撰写如下
的程序代码:
procedureTForm1.ADODataSet1FetchProgress(DataSet:TCustomADODataSet;
Progress,MaxProgress:Integer;varEventStatus:TEventStatus);
begin
ProgressBar1.Position:=Progress;
end;
上面的程序代码只是在ADO持续处理数据时不断更新主窗体中TProgressBase
的显示状态。

12)在步骤3)的TADODataSet组件的OnFetchComplete事件处理程序中撰写如
下的程序代码:
procedureTForm1.ADODataSet1FetchComplete(DataSet:TCustomADODataSet;
constError:Error;varEventStatus:TEventStatus);
begin
lEnd:=GetTickCount;
ShowMessage('总共花了'+FloatToStr((lEnd-lStart)/1000.0)+'秒');
end;
上面的程序代码是当ADO处理完数据之后便显示一个对话框,显示ADO处理
数据所花费的时间。
现在请编译并且执行这个范例应用程序。图3-13是以异步的方式来存取
ADOTestDatas这个范例数据表中数据的画面。从图中可以看到,当ADO存取数据

第3章撰写使用ADO技术的应用系统(二)113
下载
时应用程序仍然可以不断地更新主窗体中的TprogressBar。如果使用同步的方式执
行,TProgressBar便无法这样更新状态。此时我们也可以移动主窗体的位置等,可
见应用程序不会因为ADO在存取大量的数据而造成应用程序无法继续工作。
图3-13范例应用程序以异步方式执行的画面
图3-14是当ADO处理数据完毕并且触发OnFetchComplete事件处理程序时显示的
画面。从这两个画面中我们可以看到,当ADO以异步的方式执行时,OnFetchProgress
和OnFetchComplete事件可以帮助程序员取得非常有用的状态信息。
图3-14范例应用程序以异步方式执行的画面

如果你也执行这个范例应用程序,那么可以比较一下当ADO在同步执行模式
和异步执行模式中处理数据时哪一种模式比较有效率。可能你会惊讶地发现异步

异步执行能力

ExecuteOptions
eoAsyncExecute异步执行
eoAsyncFetch异步提取
eoAsyncFetchNonBlocking无阻塞方式异步提取
eoExecuteNoRecords无返回记录执行

onFetchProgressADO执行过程中会调用此事件,直到结束为止,可用于进度条显示
onFetchCompleteADO执行完成后会调用此事件

参考:http://www.cnblogs.com/key-ok/p/3533426.html

Delphi中ADO异步执行方式的更多相关文章

  1. 深入理解 JS 引擎执行机制(同步执行、异步执行以及同步中的异步执行)

    首先明确两点: 1.JS 执行机制是单线程. 2.JS的Event loop是JS的执行机制,深入了解Event loop,就等于深入了解JS引擎的执行. 单线程执行带来什么问题? 在JS执行中都是单 ...

  2. SpringBoot项目中如何异步执行一个方法

    1. SpringBoot上加上开启异步方法注解:@EnableAsync 2. 在需要异步执行的方法上,加上异步方法注解 @Async 3. 测试 5. 测试结果为,访问127.0.0.1:8888 ...

  3. PHP 异步执行方式

    在工作中我们经常遇到一些比较耗时的任务,比如用户注册发送邮件,审核短信通知等功能,同步执行这些功能的话,响应时间就会变长,所以一般我们会用队列去管理这些功能,但是如果条件不允许怎么办,今天get了一个 ...

  4. ADO异步查询显示进度条

    一般,ADO都是以同步的方式来处理数据.这就是说,当ADO开始处理数据后,应用程序必须等到ADO处理完毕之后才可以继续执行.但是除了同步执行方式之外,ADO也提供了异步执行的方式,允许当ADO处理时, ...

  5. Delphi通过ADO读写数据库

    ADO是一种程序对象,用于表示用户数据库中的数据结构和所包含的数据. ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实 ...

  6. 转:Delphi中使用比较少的一些语法

    http://www.cnblogs.com/Murphieston/p/5577836.html 本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ...

  7. Spring异步执行(@Async)2点注意事项

    Spring中可以异步执行代码,注解方式是使用@Async注解. 原理.怎么使用,就不说了. 写2点自己遇到过的问题. 1.方法是公有的 // 通知归属人 @Async public void not ...

  8. Linux下搭建实现HttpRunnerManager的异步执行、定时任务及任务监控

    前言 在之前搭建的HttpRunnerManager接口测试平台,我们还有一些功能没有实现,比如异步执行.定时任务.任务监控等,要完成异步执行,需要搭建 RabbitMQ 等环境,今天我们就来实现这些 ...

  9. PHP提权之异步执行

    在服务器上都会定时运行一些脚本以完成周期性的任务. 而这些脚本往往是以root权限启动的, 替换或者改变其中的内容就可以完成提权.而今天在这要讲解的就是php提权中的异步执行方法. 在php中一般大家 ...

随机推荐

  1. JSBridge(Android和IOS平台)的设计和实现

    前言 对于商务类的app,随着app注册使用人数递增,app的运营者们就会逐渐考虑在应用中开展一些推广活动.大多数活动具备时效性强.运营时间短的特征,一般产品们和运营者们都是通过wap页面快速投放到产 ...

  2. iOS流布局UICollectionView使用FlowLayout进行更灵活布局

    一.引言 前面的博客介绍了UICollectionView的相关方法和其协议中的方法,但对布局的管理类UICollectionViewFlowLayout没有着重探讨,这篇博客介绍关于布局的相关设置和 ...

  3. Java源码中的发现:快速判断一个int值是几位数

    判断一个int值是几位数,要是我自己实现,估计又会想到除法和模运算了,偶然在java标准API源码中发现的写法,很强大. public class Test { final static int[] ...

  4. python s12 day3

    python s12 day3   深浅拷贝 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  5. asp.net mvc4 使用java异步提交form表单时出现[object object] has no method ajaxSubmit

    最近接手了一个单子,说大不大,只是功能不少,开发过程中遇到该问题 先看脚本截图: 本以为是笔误,哪儿写错了,可是看来看去,都没发现有不合适的地方,对比过网上很多代码,都差不多,于是各种方式的,各种原因 ...

  6. ASP。net中如何在一个按钮click事件中调用另一个按钮的click事件

    方法一: 直接指定 事件<asp:Button ID="btn1" runat="server" Text="按钮1" onclick ...

  7. Linux系统swap已分区但无法挂载与cryptswap1问题

    linux下察看swap分区大小的命令 top 或者fdisk -l 或者free -m SWAP分区一般大小为物理内存的2倍,但最大不超过2G; 增加SWAP空间的方法有两个:增加另外一个SWAP分 ...

  8. 搞一个app需要多久?

    //转载文章,看后有感 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要进来干一场,尽管王总从事的行当也算跟IT沾边,但毕竟太长时 ...

  9. JavaScript HTML DOM EventListener

    JavaScript HTML DOM EventListener addEventListener() 方法 实例 点用户点击按钮时触发监听事件: document.getElementById(& ...

  10. servlet的提交

    servlet的提交和动态改变有点依赖xml 我们点击控件的时候改变了里面的变量,改变了xml,servlet发现变量变了,就会刷新页面 如果xml文档没有更新,浏览器采用缓存而不则行 <for ...