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

Delphi 多線程程式設計(3):CreateThread 掛起旗標與 ResumeThread/SuspendThread 控制執行緒執行

     編輯:Delphi

前言

CreateThread 第五個參數 dwCreationFlags 控制執行緒建立後的初始狀態:

  • 0:立即執行。
  • CREATE_SUSPENDED:建立後暫停,需呼叫 ResumeThread 繼續。

配合 SuspendThread/ResumeThread 可實現執行緒的動態暫停/繼續,對應 TThread 的 Suspend/Resume 方法(已棄用)。

掛起計數機制

  • 每次 SuspendThread:計數 +1。
  • 每次 ResumeThread:計數 -1(最小為 0)。
  • 計數 = 0 → 執行;計數 > 0 → 暫停。
  • 若呼叫 n 次 SuspendThread,需呼叫 n 次 ResumeThread 才能恢復。

完整範例:背景執行緒產生隨機數,Timer 顯示,按鈕控制暫停/繼續

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;  { 建立並掛起 }
    Button2: TButton;  { 繼續 }
    Button3: TButton;  { 暫停 }
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  hThread: THandle;
  num: Integer;  { 共享變數,執行緒寫入,Timer 讀取 }

function MyThreadFun(p: Pointer): Integer; stdcall;
begin
  while True do
    num := Random(100);  { 持續更新 }
  Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ID: DWORD;
begin
  hThread := CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
  Button1.Enabled := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ResumeThread(hThread);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  SuspendThread(hThread);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 100;  { 100 ms 更新標題 }
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Caption := IntToStr(num);
end;

end.

執行畫面

執行緒掛起/繼續示範

重要警示

  • SuspendThread/ResumeThread 已被 Microsoft 棄用:任意暫停執行緒極易造成死結(如持有 Critical Section、Heap Lock 時被暫停),導致整個進程凍結。
  • TThread.Suspend/Resume 同樣棄用,Delphi 10.4+ 編譯器會發出警告。
  • 正確做法:使用 Event(TEvent)、Waitable Timer、Condition Variable 等同步物件,讓執行緒自行進入等待狀態,而非外部強制暫停。

結語

理解 CREATE_SUSPENDED 與掛起計數機制有助於閱讀舊碼,但現代多線程設計應完全避免 SuspendThread,改用協作式同步模式,確保系統穩定與可擴展性。

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