首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 多線程程式設計(1):從 Application.ProcessMessages 到 CreateThread 與 TThread 入門

     編輯:Delphi

前言:為什麼需要多線程?

單一執行緒執行耗時迴圈時,訊息佇列無法處理,視窗會「假死」(無法拖曳、重繪、回應關閉)。

階段 1:Application.ProcessMessages(偽多線程)

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 500000 do
  begin
    Canvas.TextOut(10, 10, IntToStr(i));
    Application.ProcessMessages;  { 處理訊息佇列 }
  end;
end;

缺點:拖曳視窗時迴圈暫停,非真正並行,CPU 仍被單一執行緒佔用。

階段 2:抽離函數、Lock/Unlock 習慣

function MyFun: Integer;
var
  i: Integer;
begin
  for i := 0 to 500000 do
  begin
    Form1.Canvas.Lock;
    Form1.Canvas.TextOut(10, 10, IntToStr(i));
    Form1.Canvas.Unlock;
  end;
  Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyFun;  { 仍在主執行緒執行 }
end;

關鍵習慣:Canvas.Lock/Unlock 保護 GDI 資源,未來擴充為多線程時無需重構。

階段 3:純 API CreateThread(最輕量)

function MyFun(p: Pointer): Integer; stdcall;
var
  i: Integer;
begin
  for i := 0 to 500000 do
  begin
    Form1.Canvas.Lock;
    Form1.Canvas.TextOut(10, 10, IntToStr(i));
    Form1.Canvas.Unlock;
  end;
  Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ID: DWORD;
begin
  CreateThread(nil, 0, @MyFun, nil, 0, ID);
end;

重點:

  • 入口函數必須是 全域函數,不可為類別方法。
  • 參數、回傳值、stdcall 嚴格符合 Win32 規範。
  • 執行緒函數結束即自動銷毀,無需手動釋放。

階段 4:TThread 類別(VCL 封裝,功能豐富)

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TMyThread.Execute;
var
  i: Integer;
begin
  FreeOnTerminate := True;  { 關鍵:執行緒結束自動 Free 實例 }
  for i := 0 to 500000 do
  begin
    Form1.Canvas.Lock;
    Form1.Canvas.TextOut(10, 10, IntToStr(i));
    Form1.Canvas.Unlock;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TMyThread.Create(False);  { False = 立即執行 }
end;

進階:暫停建立、稍後啟動

procedure TForm1.Button1Click(Sender: TObject);
var
  MyThread: TMyThread;
begin
  MyThread := TMyThread.Create(True);  { True = 建立後暫停 }
  MyThread.Resume;                     { 手動啟動 }
  { 簡寫:with TMyThread.Create(True) do Resume; }
end;

IDE 快速建立 TThread 衍生類別

操作步驟(對應動畫):

  1. Ctrl+J 輸入 thread 選擇範本。
  2. Shift+Ctrl+C 完成類別宣告。
  3. Ctrl+Alt+P 切換 .pas/.dfm。

IDE 建立 TThread 動畫

關鍵修正:FreeOnTerminate 預設值

  • 許多舊教材誤稱預設為 True。
  • 實測 Delphi 2007/2009/10.x 預設皆為 False。
  • 務必在 Execute 開頭設定 FreeOnTerminate := True,否則需手動追蹤實例並 Free,極易洩漏。

結語

從 ProcessMessages 到 CreateThread 再到 TThread,三種方式層層遞進。掌握 Lock/Unlock、stdcall、FreeOnTerminate 三大關鍵點,即可安全邁入 Delphi 多線程開發大門。後續將深入 CreateThread 參數細節與同步機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved