回調函數是一種機制:調用者在初始化對象時,將一個可訪問的函數地址傳遞給被調用者。當約定的事件發生時,被調用者(通常運行在另一線程)會通過該地址調用函數,實現跨線程通知。Windows API 中如 CreateThread、SetWindowLong 等均使用回調,典型簽名為:
function CallBackFunc(Wnd: HWND; Msg, WParam, LParam: Longint): Longint; stdcall;
procedure ThreadFunction(Ptr: Pointer); stdcall;
消息可視為一種特殊的回調:調用者傳遞窗口句柄與消息編號,事件發生時被調用者發送消息。兩者區別在於線程模型:回調常涉及工作線程,消息多在主線程處理。
VCL 組件大量使用事件模型(如 TForm.OnCreate)。其本質與回調相同,但形式不同:
of object),綁定實例,僅限 Delphi 內部。定義事件類型示例:
type
TCallBackFunc = procedure(pData: Pointer) of object;
回調函數常在工作線程中執行,訪問共享資源時需使用臨界區(TCriticalSection)保護,避免競態條件。
| 特性 | 回調函數 | Delphi 事件 |
|---|---|---|
| 形式 | 全局函數/過程 | 對象方法 |
| 跨語言 | 支持 | 不支持 |
| 線程上下文 | 通常工作線程 | 通常主線程 |
| 類型安全 | 較弱 | 編譯期檢查 |