如題,每一個窗口對應着一個回調,這裏就有個問題,到底是底層用一個map(或者vector)保存起來一起發出去應用層來區分接收,還是一開始就區分發? 針對我這個問題,答案就是底層分開發。
剛開始嘗試底層統一發,因爲底層傳來了userData, 就想着是不是可以用this指針進行判斷,其實是可以判斷的。即使回調函數是static類型,在static類型指針裏面不能用this指針,再寫一層就好了:
.h中
static bool AsyncOutputDataCB(Data *pData, void* pUserData);
bool AsyncOutputDataCB(void* pUserData,Data *pData);
static bool AsyncOutputStatusCB(int n32ID, int wParam, int lParam, void* pUserData);
bool AsyncOutputStatusCB(void* pUserData, int n32ID, int wParam, int lParam);
.cpp中 (爲了舉例,我就寫一個)
bool AClass::AsyncOutputDataCB(Data *pFrameData, void* pUserData)
{
if (!pUserData)
{
return false;
}
AClass *pThis = (AClass *)pUserData;
return pThis->AsyncOutputDataCB(pUserData ,pFrameData);
}
bool AClass::AsyncOutputDataCB(Data *pFrameData, void* pUserData)
{
AClass *t_wgt = (AClass*)pUserData;
if(t_wgt == this){
if (m_Widget)
{
m_Widget->outputData(pFrameData);
return CX_OK;
}
return true;
}
return false;
}
用這種方式其實是可以區分的,但是我接收到的數據就區分不開,因爲底層每一次就發多個窗口的回調,那個即使我需要的數據B是每個窗口獨有的,多個窗口收到的數據B都是一樣的,就沒辦法區分顯示了。
那麼只好在底層就進行分開發。
還有,底層有可能有些地方是異步加載的,也就是你取到的指針可能爲空,但是你又要用它怎麼辦呢?你就把容易出錯的那一句先提前把你要操作的數據送進去,然後在該指針初始化的時候,在指針那個類裏面再重複進行一次就可以了。