delphi 多執行緒例項
阿新 • • 發佈:2019-02-02
下面筆者將介紹一個簡單的例項,解釋和說明前面所述的內容。
1) 建立Form,在其中建立兩個按鈕“開始採集” 和“停止採集”,新增一個PaintBox1。
2) 建立一個新的單元,在其中輸入以下程式碼:
unit CollectThread;
interface
uses
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<FPresetTime
DoTerminate; //時間到後執行緒終止
end;
// 在指定的畫布上顯示採集到的資料;
procedure TCollectDataThread.ShowData;
begin
FCanvas.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插槽來實現資料採集的硬體裝置,串列埠通訊中的採集方法也與上述思想相類似。鑑於筆者的水平有限,歡迎讀者批評指正文章中的不足之處。