采用多线程进行数据采集
2008-04-09 04:17:42来源:互联网 阅读 ()
---- 以上讨论的两种方法都是在DOS下的方法;在Win95下,现在有了一个更好的方法——多线程技术。现在,我们可以利用多线程技术来进行数据采集。
---- 1. 采用多线程进行数据采集的优点
---- Win95/98最让人喜爱的除了漂亮的界面以外,就是多线程与多任务了。DOS环境中,执行中的程序可以独占全部的资源;在Windows环境中,虽然它是一个略具雏形的多任务环境,但是只要你喜欢,你的程序仍然可以掌握所有的CPU时间。但是,在Windows 95以及Windows NT中,一个程序无法独占所有的CPU执行时间。而且,一个程序也不是从头到尾一条线。相反,一个程序在执行中可以分为多个程序片段,同时执行。这些能同时执行的程序片段称为线程。在Windows 95以及Windows NT中,操作系统同一时间可以轮流执行多个程序,这就是多任务。
---- 采用多线程进行数据采集可以有效地加快程序的反应速度、增加执行的效率。一般的程序中都要处理用户的输入,但用户的输入速度与CPU的执行速度相比就向走路与做飞机一样。这样,CPU就将浪费大量的时间用来等待用户的输入(如在DOS环境中)。如果采用多线程,那么就可以用一个线程等待用户的输入;另一个线程进行数据处理或其他的工作。对于数据采集程序,可以用一个单独的线程进行数据采集。这样,能最大限度的保证 ?氖凳毙裕??硗獾南叱掏?庇帜芗笆钡叵煊τ没У牟僮骰蚪?惺?荽?怼7裨颍?绦蛟诓杉??菔本筒荒芟煊τ没У牟僮鳎辉谙煊τ没Р僮魇本筒荒芙?惺?莶杉?S绕涞辈杉?氖?萘亢艽螅??荽?砣挝窈苤厥保?绻?徊捎枚嘞叱蹋?杉?钡穆?さ牡却?呛苋萌私邮艿摹?
---- 但是,多线程要比普通程序设计复杂得多。由于任一时刻都可能有多个线程同时执行,所以,许多的变量、数据都可能会被其他线程所修改。这就是多线程程序中最关键的线程间的同步控制问题。
---- 2. 多线程进行数据采集应解决的问题
---- 其实,多线程程序设计复杂是暂时的;如果,你采用传统的C进行多线程的设计,那么你必须自己控制线程间的同步。那将是很复杂的。但是,如果利用面向对象的设计方法,采用Delphi进行多线程程序设计,问题就简单多了。这是因为,Delphi已将多线程的复杂性替我们处理了,我们所要做的就是继承。
---- 具体地说,多线程数据采集需要完成以下工作:
---- ① 从TThread类派生一个自己的类SampleThread。这就是我们用于数据采集的类。进行采集时,只需要简单地创建一个SampleThread的实例。
---- ② 重载超类TThread的Execute方法。在这一方法中将具体地执行数据采集任务。
---- ③ 如果希望一边采集一边显示,就在编写几个用于显示采集进度的过程,供Execute方法调用。
---- TThread类中最常用的属性/方法如下:
Create方法:constructor Create (CreateSuspended: Boolean);
---- 其中CreateSuspended参数确定线程在创建时是否立即执行。如果为True,新线程在创建后被挂起;如果为False,线程在创建后立即执行。
FreeOnTerminate属性: property FreeOnTerminate: Boolean;
---- 该属性确定程序员是否负责撤消该线程。如果该属性为True,VCL将在该线程终止时自动撤消线程对象。它的缺省值为False。
OnTerminate属性: property OnTerminate: TNotifyEvent;
---- 该属性指定一个当线程终止时发生的事件。
---- 下面看一个具体的例子:
---- 3. 多线程数据采集的实现
---- 这是笔者开发的一个测抽油机功图的程序。它的功能是采集抽油机悬点的载荷及位移数据,经过处理后做出抽油机的功图。图1(略)所示是数据采集时的界面。点“采集数据”按钮后,程序将创建一新的线程,并设置其属性。这一新线程将完成数据采集任务。程序如下:
Procedure TsampleForm. DoSampleBtnClick(Sender: TObject); Begin ReDrawBtn.Enabled := True; DoSampleBtn.Enabled := False; FFTBtn.Enabled := True; TheSampler := SampleThread.Create(False); 创建采集线程 TheSampler.OnTerminate := FFTBtnClick; 采集完成后要执行的任务 TheSampler.FreeOnTerminate := True; 采集完成后撤消 End;
---- 采集线程的类定义如下:
Type SampleThread = class(TThread) Public function AdRead(ach: byte): integer; safecall; 读A/D卡的函数 procedure UpdateCaption; 显示采集所用时间 private { Private declarations } protected thes, thep: real; dt: real; id: integer; st, ed: LongInt; procedure Execute; override; 这是关键。 End;标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Delphi中的INI文件编程
下一篇:软件中复活节彩蛋的实现
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash