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

Delphi 多線程程式設計(2):CreateThread 參數詳解、執行緒句柄與 TContext 結構

     編輯:Delphi

CreateThread 完整原型

function CreateThread(
  lpThreadAttributes: Pointer;  { 安全性屬性,通常 nil }
  dwStackSize: DWORD;           { 堆疊大小,0 = 預設 1MB }
  lpStartAddress: TFNThreadStartRoutine; { 入口函數指標 }
  lpParameter: Pointer;         { 傳遞參數 }
  dwCreationFlags: DWORD;       { 建立旗標 }
  var lpThreadId: DWORD         { 輸出:執行緒 ID }
): THandle; stdcall;            { 回傳:執行緒句柄 }

一、執行緒句柄 vs 指標

  • 指標:直接指向記憶體位址,可讀寫資料。
  • 句柄:不透明的 32 位元值,代表核心物件參考。系統不公開內部結構,包含真實指標、存取權限、參考計數等。僅能透過 API(WaitForSingleObject、GetExitCodeThread、DuplicateHandle 等)操作。
  • 設計目的:安全性,防止使用者模式程式破壞核心物件完整性。

二、ExitThread 與資源釋放

procedure TForm1.Button1Click(Sender: TObject);
begin
  ExitThread(0);  { 結束目前執行緒(主執行緒),進程隨之終止 }
end;

慣用規則:

  1. 純 API CreateThread:入口函數 return 即自動結束,無需 ExitThread。
  2. TThread 類別:嚴禁 呼叫 ExitThread/EndThread,會導致 VCL 物件、介面參考計數、記憶體管理器資源洩漏。正確做法是讓 Execute 自然結束,並設定 FreeOnTerminate := True。

三、執行緒上下文切換與 TContext

系統排程器在執行緒切換時,會保存/恢復 CPU 寄存器狀態,對應結構 TContext(WinNT.h CONTEXT):

type
  TContext = record
    ContextFlags: DWORD;
    Dr0, Dr1, Dr2, Dr3, Dr6, Dr7: DWORD;      { 偵錯暫存器 }
    FloatSave: TFloatingSaveArea;              { FPU/SSE 狀態 }
    SegGs, SegFs, SegEs, SegDs: DWORD;         { 區段暫存器 }
    Edi, Esi, Ebx, Edx, Ecx, Eax: DWORD;       { 通用暫存器 }
    Ebp, Eip: DWORD;                           { 基址指標、指令指標 }
    SegCs, EFlags, Esp, SegSs: DWORD;          { 程式碼段、旗標、堆疊指標、堆疊段 }
  end;

可透過 GetThreadContext/SetThreadContext 讀寫,應用於偵錯器、例外處理、執行緒攔截等進階場景。

四、執行緒 ID 與句柄的差異

  • ID (DWORD):系統全域唯一,輕量,適合日誌、除錯、PostThreadMessage。
  • 句柄 (THandle):進程內部參考,可複製(DuplicateHandle)、偽句柄(GetCurrentThread),攜帶存取權限。
  • 主執行緒 ID 取得方式:GetCurrentThreadId、System.MainThreadID、System.MainInstance(實為 HInstance)。

五、TThread.Create 內部流程

TThread.Create → BeginThread (System.pas) → CreateThread。BeginThread 額外配置 TThread 實例記憶體、例外框架、FreeOnTerminate 邏輯等。

結語

深入理解 CreateThread 每個參數的語義、句柄與 ID 的本質差異、執行緒上下文結構,是從「會用多線程」進階到「精通多線程」的必經之路。下一篇將聚焦 lpParameter 參數傳遞技巧與同步物件入門。

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