好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Delphi_多线程实例高级.doc

5页
  • 卖家[上传人]:枫**
  • 文档编号:536725248
  • 上传时间:2023-06-05
  • 文档格式:DOC
  • 文档大小:38.51KB
  • / 5 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Delphi 多线程实例下面笔者将介绍一个简单的实例,解释和说明前面所述的内容1) 建立Form,在其中建立两个按钮“开始采集” 和“停止采集”,添加一个PaintBox12) 建立一个新的单元,在其中输入以下代码:unit CollectThread;interfaceuses Classes,SysUtils,stdctrls,Graphics;type TCollectDataThread = class(TThread) private FPreSetTime:Word; FUsedTime:integer; FCanvas:TCanvas; protected procedure Execute; override; procedure ShowData; public CollectData:array[0..1023]of integer; constructor Create(PresetTime:Word;Canvas:TCanvas);end;implementation {TCollectDataThread}constructor TCollectDataThread.Create(PreSetTime:Word;Canvas:TCanvas);var i:integer;begin for i:=0 to 1023 do CollectData[i]:=0; // 给数据赋初值 FCanvas:=Canvas; FPreSetTime:=PreSetTime; // 预置采集次数 FUsedTime:=0; // 已经采集的次数 inherited Create(true); FreeOnTerminate := True; //当线程终止时自动释放该线程end; procedure TCollectDataThread.Execute;var flag:Byte; address:Byte; i:integer;begin while FUsedTime < FPresetTime do begin FUsedTime:=FUsedTime+1; flag:=0; // 数据准备好标志 {由于您在调试程序时没有硬件支持,所以建议您使用下面的这段程序来 模拟硬件的工作,} for i:=0 to 9000000 do //产生迟延, flag:=i; if flag>0 then begin CollectData[FUsedTime]:=round(50.0*sin(3.1415/50*FUsedTime)); Synchronize(ShowData); //同步调用数据显示函数 end; {实际上从硬件中采集数据最常用的是如下形式,但是这段程序正常工作需要 相应的I/O接口设支持,所以它仅共参考} {repeat begin flag:=inportb($341); // 数据是否准备好标志 flag:=flag and $c0; if (flag=0) then // 如果AD转换的数据准备好 begin CollectData[FUsedTime]:=inportw($342); end; flag:=flag and $10; // 恢复数据准备好标志 end; // end while not flag=0 until(flag=0); Synchronize(ShowData); //同步调用数据显示函数 } end; //while FUsedtime

      6、结束语采用上面所述的方法,笔者实现了对心电谱数据的采集和显示,达到了很好的效果本方法尤其适用于那些利用计算机I/O插槽来实现数据采集的硬件设备,串口通信中的采集方法也与上述思想相类似鉴于笔者的水平有限,欢迎读者批评指正文章中的不足之处Delphi 多线程实例下面笔者将介绍一个简单的实例,解释和说明前面所述的内容1) 建立Form,在其中建立两个按钮“开始采集” 和“停止采集”,添加一个PaintBox12) 建立一个新的单元,在其中输入以下代码:unit CollectThread;interfaceuses Classes,SysUtils,stdctrls,Graphics;type TCollectDataThread = class(TThread) private FPreSetTime:Word; FUsedTime:integer; FCanvas:TCanvas; protected procedure Execute; override; procedure ShowData; public CollectData:array[0..1023]of integer; constructor Create(PresetTime:Word;Canvas:TCanvas);end;implementation {TCollectDataThread}constructor TCollectDataThread.Create(PreSetTime:Word;Canvas:TCanvas);var i:integer;begin for i:=0 to 1023 do CollectData[i]:=0; // 给数据赋初值 FCanvas:=Canvas; FPreSetTime:=PreSetTime; // 预置采集次数 FUsedTime:=0; // 已经采集的次数 inherited Create(true); FreeOnTerminate := True; //当线程终止时自动释放该线程end; procedure TCollectDataThread.Execute;var flag:Byte; address:Byte; i:integer;begin while FUsedTime < FPresetTime do begin FUsedTime:=FUsedTime+1; flag:=0; // 数据准备好标志 {由于您在调试程序时没有硬件支持,所以建议您使用下面的这段程序来 模拟硬件的工作,} for i:=0 to 9000000 do //产生迟延, flag:=i; if flag>0 then begin CollectData[FUsedTime]:=round(50.0*sin(3.1415/50*FUsedTime)); Synchronize(ShowData); //同步调用数据显示函数 end; {实际上从硬件中采集数据最常用的是如下形式,但是这段程序正常工作需要 相应的I/O接口设支持,所以它仅共参考} {repeat begin flag:=inportb($341); // 数据是否准备好标志 flag:=flag and $c0; if (flag=0) then // 如果AD转换的数据准备好 begin CollectData[FUsedTime]:=inportw($342); end; flag:=flag and $10; // 恢复数据准备好标志 end; // end while not flag=0 until(flag=0); Synchronize(ShowData); //同步调用数据显示函数 } end; //while FUsedtime

      6、结束语采用上面所述的方法,笔者实现了对心电谱数据的采集和显示,达到了很好的效果本方法尤其适用于那些利用计算机I/O插槽来实现数据采集的硬件设备,串口通信中的采集方法也与上述思想相类似。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.