1 回調函數的概述
回調函數是這樣一種機制:調用者在初始化一個對象(這裡的對象是泛指,包括OOP中的對象、全局函數等)時,將一些參數傳遞給對象,同時將一個調用者可以訪問的函數地址傳遞給該對象。這個函數就是調用者和被調用者之間的一種通知約定,當約定的事件發生時,被調用者(一般會包含一個工作線程)就會按照回調函數地址調用該函數。
這種方式,調用者在一個線程,被調用者在另一個線程。
消息:
消息也可以看作是某種形式的回調,因為消息也是在初始化時由調用者向被調用者傳遞一個句柄和一個消息編號,在約定的事件發生時被調用者向調用者發送消息。
這種方式,調用者在主線程中,被調用者在主線程或者工作線程中。
Delphi事件模型:
在Delphi的VCL中有很多可視化組件都是使用事件模型,例如TForm的OnCreate事件,其原理是:在設計時指定事件函數,在運行時事件觸發,則會調用在設計時指定的事件函數。
在機制上,Delphi事件模型與回調是一樣的。但具體形式有些區別,純的回調函數是全局函數的形式,而Delphi事件是對象方法的形式,即可以定義如下回調函數類型
type
TCallBackFunc = procedure (pData: Pointer) of object;
2 回調函數的使用說明
回調函數主要在兩個場合使用,第一個是某些Windows的API要求用回調函數作為其參數地址,另一種是用戶在某種特定的場合定義的某個函數需要使用回調函數作為其參數地址,對於用戶的定義的函數來說,一般是當調用動態連接庫中的函數時使用。
對於使用一個回調函數主要有以下幾個步驟:
1、定義一個回調函數類型,跟一般的函數過程的定義並沒有什麼區別,但其定義必須根據需要滿足回調函數的函數要求,唯一的區別在於在函數或過程的定義後面必須聲明其為Windows標准調用;
例:
type
THDFunction= function(I:integer;s:string):integer; stdcall;
對於過程的聲明:
type
THDProcedure=procedure(s:string); stdcall;
2、 然後根據此原形定義一個相應的函數或過程,對於這個函數或過程來說名字沒有什麼要求,對函數其參數的類型和返回值的類型必須和定義的回調函數類型完全一致,對於過程來說,只需要其參數類型一樣就可以了。
例:根據上面的函數和過程的原形定義一個相應的函數和一個相應的過程。
函數原形定義:
Function HdFunExample(k:integer,sExam:string):integer; stdcall;
過程定義:
procedure HdProExample(sExam:string);stdcall;
3、 在程序中實現此回調函數或著過程;
Function HdFunExample(k:integer,sExam:string):integer; stdcall;
Begin
End