1. 程式人生 > >delphi 多執行緒例項

delphi 多執行緒例項

  下面筆者將介紹一個簡單的例項,解釋和說明前面所述的內容。 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插槽來實現資料採集的硬體裝置,串列埠通訊中的採集方法也與上述思想相類似。鑑於筆者的水平有限,歡迎讀者批評指正文章中的不足之處。