網上關于回調函數的解釋非常多,概念、代碼、各種類比都很全面,這里只結合項目談談自己的理解。
軟件基于MF框架從攝像頭采集視頻,其中一項功能是將幀圖像保存為bmp格式。整個功能可以分兩步實現,即數據采集和格式轉換。數據采集由框架自帶的函數實現,將采集到的圖像數據push入隊列,并于適當的時機pop出來,由函數實現圖像格式的轉換和保存。
我一開始的思路是用通信中握手的方式,當數據push后給主窗口發送一條自定義消息,由消息響應函數將數據pop出來并進行處理。這種方式需要數據調用方(界面)和發送方(底層)事先約定好,當數據采集方法封裝成庫時(實際上幾乎一定會這樣),需要使用者去了解庫的細節,因此這種方式非常不靈活。
后來用回調函數實現功能。我把回調函數理解成一張圖紙,好比說我需要做一件衣服,或者一條褲子,我畫一張圖紙去完成我的需求,雖然我沒有布和線等材料,但我可以把圖紙交給裁縫店替我把需求實現了。這里我的圖紙就是回調函數,裁縫店就是調用方。用代碼可以寫成:
typedef void (CALLBACK *blueprint)(param1, ... , paramN); //回調函數
void WINAPI tailor(param1, ... , paramN, blueprint my_suit); //調用方
具體到項目中,回調函數的功能是實現格式轉換和保存,調用借口由底層提供,功能是提供圖像數據。這樣調用方可以不但可以將數據保存為bmp,還能通過修改回調保存成其他格式,實現了函數的多態。