2011年3月6日 星期日

callback function

最近在包裝一些程式碼…
主要是讓其他人方便使用又可以讓程式碼達到隱密性的要求…
一直以來只有使用像 AfxBeginThread、STL Sort 這類的 callback 經驗…
以致於忘了一些細節…剛好這次吃了點虧所以印像變深刻了…記錄一下…

Transmitter.h

// Transmitter.h

typedef void (*cbk_func)(int); // 回傳為 void 參數型態為 int

class CTransmitter
{
  public:
  cbk_func handler;
  void go();
};

CallBackSampleDlg.h

// CallBackSampleDlg.h

class CCallBackSampleDlg : public CDialog
{
  public:
  static void CompletedHandeler(int nResult);
};

Transmitter.cpp

// Transmitter.cpp

void CTransmitter::go()
{
  for(int i = 0; i < 101; i+=10)
  {
    handler(i);
    Sleep(1000);
 }
}

CallBackSampleDlg.cpp

// CallBackSampleDlg.cpp

void CallBackSampleDlg::OnBnClickedButtonTrans()
{
  CTransmitter transmitter;
  transmitter.handler = CallBackSampleDlg::CompletedHandeler;
  transmitter.go();
}

void CallBackSampleDlg::CompletedHandeler(int nResult)
{
  CString strMsg;
  strMsg.Format(_T("已傳送 %d \%"), nResult);
  MessageBox(strMsg);
}


其實重點在於 function point 只能是 static 或 global 的 function
否則在指定為 callback 目標時是會發生 compiler error 的…
理由是只有這兩種 function 才能在 compiler 時期就取得唯一的 point

同時也要注意 static function 內只能操作 static 的成員…
所以在設計需要 callback 的類別時要多注意點…
若 callback 的目標有必須為非 static 的需求…
就得利用傳物件的指標加上 interface 來解決嘍…

沒有留言:

張貼留言