CreateThread 第四個參數 lpParameter: Pointer 可傳遞任意 32 位元資料給入口函數。本文示範兩種傳遞滑鼠座標的寫法:指標傳遞結構體與整數壓縮高/低字組,後者技巧源自 Windows 訊息機制(lParam)。
var
pt: TPoint; { 必須為全域,避免區域變數生命週期結束 }
function MyThreadFun(p: Pointer): Integer; stdcall;
var
i: Integer;
pt2: TPoint;
begin
pt2 := PPoint(p)^; { 解參考取得座標快照 }
for i := 0 to 1000000 do
begin
with Form1.Canvas do
begin
Lock;
TextOut(pt2.X, pt2.Y, IntToStr(i));
Unlock;
end;
end;
Result := 0;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ID: DWORD;
begin
pt := Point(X, Y);
CreateThread(nil, 0, @MyThreadFun, @pt, 0, ID);
end;
缺點:需全域變數暫存座標,若連續快速點擊,前一筆座標可能被覆蓋導致競態條件。
利用 MakeLong/LoWord/HiWord 將 X、Y 壓縮為單一 32 位元整數,再轉型為 Pointer 傳遞:
function MyThreadFun(p: Pointer): Integer; stdcall;
var
i: Integer;
x, y: Word;
begin
x := LoWord(Integer(p));
y := HiWord(Integer(p));
{ 等價寫法:
x := Integer(p) and $FFFF;
y := Integer(p) shr 16;
}
for i := 0 to 1000000 do
begin
with Form1.Canvas do
begin
Lock;
TextOut(x, y, IntToStr(i));
Unlock;
end;
end;
Result := 0;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ID: DWORD;
num: Integer;
begin
num := MakeLong(X, Y); { 或 Y shl 16 + X }
CreateThread(nil, 0, @MyThreadFun, Pointer(num), 0, ID);
end;

Windows.pas,實際為巨集/內建函式,零成本。PostMessage、SendMessage 的 lParam、wParam 參數打包。GetMem/AllocMem),傳遞指標,執行緒結束前 FreeMem。Lock/Unlock 僅保護 Canvas,計數器 i 仍在等待時遞增,真實專案應使用 Critical Section、Event、Mutex 等同步物件(下一篇主題)。整數壓縮傳遞參數是 Windows 系統程式設計的經典慣用語,掌握後可簡化執行緒參數傳遞、視窗訊息打包與回呼資料結構設計,提升程式碼緊湊度與執行效率。