Delphi_多线程实例高级
- 格式:doc
- 大小:38.50 KB
- 文档页数:5
Delphi 多线程实例下面笔者将介绍一个简单的实例,解释和说明前面所述的内容。
1)建立Form,在其中建立两个按钮“开始采集”和“停止采集”,添加一个PaintBox1。
2)建立一个新的单元,在其中输入以下代码:unit CollectThread;interfaceusesClasses,SysUtils,stdctrls,Graphics;typeTCollectDataThread = class(TThread)privateFPreSetTime:Word;FUsedTime:integer;FCanvas:TCanvas;protectedprocedure Execute; override;procedure ShowData;publicCollectData:array[0..1023]of integer;constructor Create(PresetTime:Word;Canvas:TCanvas);end;implementation{TCollectDataThread}constructor TCollectDataThread.Create(PreSetTime:Word;Canvas:TCanvas);var i:integer;beginfor i:=0 to 1023 do CollectData[i]:=0; // 给数据赋初值FCanvas:=Canvas;FPreSetTime:=PreSetTime; // 预置采集次数FUsedTime:=0; // 已经采集的次数inherited Create(true);FreeOnTerminate := True; //当线程终止时自动释放该线程end;procedure TCollectDataThread.Execute;varflag:Byte;address:Byte;i:integer;beginwhile FUsedTime < FPresetTime dobeginFUsedTime:=FUsedTime+1;flag:=0; // 数据准备好标志{由于您在调试程序时没有硬件支持,所以建议您使用下面的这段程序来模拟硬件的工作,}for i:=0 to 9000000 do //产生迟延,flag:=i;if flag>0 thenbeginCollectData[FUsedTime]:=round(50.0*sin(3.1415/50*FUsedTime));Synchronize(ShowData); //同步调用数据显示函数end;{实际上从硬件中采集数据最常用的是如下形式,但是这段程序正常工作需要相应的I/O接口设支持,所以它仅共参考}{repeatbeginflag:=inportb($341); // 数据是否准备好标志flag:=flag and $c0;if (flag=0) then // 如果AD转换的数据准备好beginCollectData[FUsedTime]:=inportw($342);end;flag:=flag and $10; // 恢复数据准备好标志end; // end while not flag=0until(flag=0);Synchronize(ShowData); //同步调用数据显示函数}end; //while FUsedtime<FPresetTimeDoTerminate; //时间到后线程终止end;// 在指定的画布上显示采集到的数据;procedure TCollectDataThread.ShowData;beginFCanvas.Pixels[2*FUsedTime,80+CollectData[FUsedTime]]:=clRed;end;end.3)在Form的单元文件中声明变量CollTestThread:TCollectDataThread,并在Form的OnCreate事件中加入以下代码:CollTestThread:= TCollectDataThread.Create(500,PaintBox1.Canvas);4)在“开始采集”按钮的OnClick事件中加入以下代码:CollTestThread.Resume;5)在“暂停采集”按钮的OnClick事件中加入以下代码:CollTestThread.Suspend;用户可以利用前面所提到的Synchronize函数来窗体,或者使用定时器定期刷新屏幕,这两种方式都可以间隔一定时间显示采集数据情况。
6、结束语采用上面所述的方法,笔者实现了对心电谱数据的采集和显示,达到了很好的效果。
本方法尤其适用于那些利用计算机I/O插槽来实现数据采集的硬件设备,串口通信中的采集方法也与上述思想相类似。
鉴于笔者的水平有限,欢迎读者批评指正文章中的不足之处。
Delphi 多线程实例下面笔者将介绍一个简单的实例,解释和说明前面所述的内容。
1)建立Form,在其中建立两个按钮“开始采集”和“停止采集”,添加一个PaintBox1。
2)建立一个新的单元,在其中输入以下代码:unit CollectThread;interfaceusesClasses,SysUtils,stdctrls,Graphics;typeTCollectDataThread = class(TThread)privateFPreSetTime:Word;FUsedTime:integer;FCanvas:TCanvas;protectedprocedure Execute; override;procedure ShowData;publicCollectData:array[0..1023]of integer;constructor Create(PresetTime:Word;Canvas:TCanvas);end;implementation{TCollectDataThread}constructor TCollectDataThread.Create(PreSetTime:Word;Canvas:TCanvas);var i:integer;beginfor i:=0 to 1023 do CollectData[i]:=0; // 给数据赋初值FCanvas:=Canvas;FPreSetTime:=PreSetTime; // 预置采集次数FUsedTime:=0; // 已经采集的次数inherited Create(true);FreeOnTerminate := True; //当线程终止时自动释放该线程end;procedure TCollectDataThread.Execute;varflag:Byte;address:Byte;i:integer;beginwhile FUsedTime < FPresetTime dobeginFUsedTime:=FUsedTime+1;flag:=0; // 数据准备好标志{由于您在调试程序时没有硬件支持,所以建议您使用下面的这段程序来模拟硬件的工作,}for i:=0 to 9000000 do //产生迟延,flag:=i;if flag>0 thenbeginCollectData[FUsedTime]:=round(50.0*sin(3.1415/50*FUsedTime));Synchronize(ShowData); //同步调用数据显示函数end;{实际上从硬件中采集数据最常用的是如下形式,但是这段程序正常工作需要相应的I/O接口设支持,所以它仅共参考}{repeatbeginflag:=inportb($341); // 数据是否准备好标志flag:=flag and $c0;if (flag=0) then // 如果AD转换的数据准备好beginCollectData[FUsedTime]:=inportw($342);end;flag:=flag and $10; // 恢复数据准备好标志end; // end while not flag=0until(flag=0);Synchronize(ShowData); //同步调用数据显示函数}end; //while FUsedtime<FPresetTimeDoTerminate; //时间到后线程终止end;// 在指定的画布上显示采集到的数据;procedure TCollectDataThread.ShowData;beginFCanvas.Pixels[2*FUsedTime,80+CollectData[FUsedTime]]:=clRed;end;end.3)在Form的单元文件中声明变量CollTestThread:TCollectDataThread,并在Form的OnCreate事件中加入以下代码:CollTestThread:= TCollectDataThread.Create(500,PaintBox1.Canvas);4)在“开始采集”按钮的OnClick事件中加入以下代码:CollTestThread.Resume;5)在“暂停采集”按钮的OnClick事件中加入以下代码:CollTestThread.Suspend;用户可以利用前面所提到的Synchronize函数来窗体,或者使用定时器定期刷新屏幕,这两种方式都可以间隔一定时间显示采集数据情况。
6、结束语采用上面所述的方法,笔者实现了对心电谱数据的采集和显示,达到了很好的效果。
本方法尤其适用于那些利用计算机I/O插槽来实现数据采集的硬件设备,串口通信中的采集方法也与上述思想相类似。
鉴于笔者的水平有限,欢迎读者批评指正文章中的不足之处。