function CreateThread(
lpThreadAttributes: Pointer; { 安全性屬性,通常 nil }
dwStackSize: DWORD; { 堆疊大小,0 = 預設 1MB }
lpStartAddress: TFNThreadStartRoutine; { 入口函數指標 }
lpParameter: Pointer; { 傳遞參數 }
dwCreationFlags: DWORD; { 建立旗標 }
var lpThreadId: DWORD { 輸出:執行緒 ID }
): THandle; stdcall; { 回傳:執行緒句柄 }
WaitForSingleObject、GetExitCodeThread、DuplicateHandle 等)操作。procedure TForm1.Button1Click(Sender: TObject);
begin
ExitThread(0); { 結束目前執行緒(主執行緒),進程隨之終止 }
end;
慣用規則:
CreateThread:入口函數 return 即自動結束,無需 ExitThread。TThread 類別:嚴禁 呼叫 ExitThread/EndThread,會導致 VCL 物件、介面參考計數、記憶體管理器資源洩漏。正確做法是讓 Execute 自然結束,並設定 FreeOnTerminate := True。系統排程器在執行緒切換時,會保存/恢復 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 讀寫,應用於偵錯器、例外處理、執行緒攔截等進階場景。
PostThreadMessage。DuplicateHandle)、偽句柄(GetCurrentThread),攜帶存取權限。GetCurrentThreadId、System.MainThreadID、System.MainInstance(實為 HInstance)。TThread.Create → BeginThread (System.pas) → CreateThread。BeginThread 額外配置 TThread 實例記憶體、例外框架、FreeOnTerminate 邏輯等。
深入理解 CreateThread 每個參數的語義、句柄與 ID 的本質差異、執行緒上下文結構,是從「會用多線程」進階到「精通多線程」的必經之路。下一篇將聚焦 lpParameter 參數傳遞技巧與同步物件入門。