回呼函數與Delphi的事件模型回呼函數:回呼函數是這樣一種機制:呼叫者在初始化一個物件(這裡的物件是泛指,包括OOP中的物件、全域函數等)時,將一些參數傳遞給對象,同時將一個呼叫者可以存取的函數位址傳遞給該物件。這個函數就是呼叫者和被呼叫者之間的一種通知約定,當約定的事件發生時,被呼叫者(一般會包含一個工作執行緒)就會依照回呼函數位址呼叫函數。這種方式,呼叫者在一個線程,被呼叫者在另一個線程。在Windows API中有一些函數使用回呼函數,例如CreateThread、SetWindowLong等。對應的回呼函數定義為以下形式:function CallBackFunc(Wnd: HWND; Msg, WParam, LParam: Longint): Longint;stdcall;PRocedure ThreadFunction(Ptr: Pointer);stdcall;訊息:訊息也可以看作是某種形式的回調,因為訊息也是在初始化時由呼叫者向被呼叫者傳遞一個句柄和一個訊息編號,在約定的事件發生時被呼叫者向調用者發送訊息。這種方式,呼叫者在主執行緒中,被呼叫者在主執行緒或工作執行緒中。 Delphi事件模型:在Delphi的VCL中有很多視覺化元件都是使用事件模型,例如TForm的OnCreate事件,其原理是:在設計時指定事件函數,在運行時事件觸發,則會呼叫在設計時指定的事件函數。在機制上,Delphi事件模型與回調是一樣的。但具體形式有些區別,純的回呼函數是全域函數的形式,而Delphi事件是物件方法的形式,即可以定義如下回呼函數類型typeTCallBackFunc = procedure (pData: Pointer) of object;這就使得Delphi事件只能在Delphi內部使用,而回呼函數是可以跨語言的。另外也要注意,回呼函數一般(在Delphi的元件是在主線程中)是在回調體中建立的線程,因此要有臨界區保護。