一般,線程都是全域函數,那要想線上程中使用類成員函數怎麼辦呢?
解決途徑是: 將類的指標作為參數 傳遞給線程函數。
SearchProcess()是CMainFrame類成員函數
SearchThread(LPVOID pParam) 線程函數
CMainFrame::Fun() -------- 當調用此函數時,執行線程
方法一: 全域函數
void CMainFrame::Fun(){AfxBeginThread(SearchThread,this); }
//全域函數 不能訪問類的私人變數
UINT SearchThread(LPVOID pParam) //全域函數{CMainFrame* pMainFrm = (CMainFrame*)pParam;pMainFrm->SearchProcess();return 1;}
方法二: 靜態成員函數
static UINT SearchThread(LPVOID pParam); //搜尋線程
靜態成員函數不可以調用類的非靜態成員。因為靜態成員函數不含this指標。
但此處,將對應指標傳過來, 因此,可以通過指標調用其他成員
UINT CMainFrame::SearchThread(LPVOID pParam) //靜態成員函數 {CMainFrame* pMainFrm = (CMainFrame*)pParam;pMainFrm->SearchProcess();return 1;}
void CMainFrame::Fun(){AfxBeginThread(SearchThread,this); }
方法三: 友元函數
友元函數 可以訪問類的私人資料等
friend UINT SearchThread(LPVOID pParam); //搜尋線程
UINT SearchThread(LPVOID pParam) //友元函數 可以訪問類的私人變數{CMainFrame* pMainFrm = (CMainFrame*)pParam;pMainFrm->SearchProcess();return 1;}
void CMainFrame::Fun(){AfxBeginThread(SearchThread,this); }
這三種方法 使用的函數類型不同, 但其中心思想都是一致的
其策略為: 將類對象的指標傳遞到線程中, 通過此指標 調用類成員函數
注意: 類成員函數SearchProcess() 不要出現求取其他視圖中對象地址情況
而要將其,作為類變數,在初始化中賦值
比如, 此函數如果用到其他視圖,則要在初始化中為其它視圖指標賦值,而不要在此函數中賦值
錯誤方式:
void CMainFrame::SearchProcess(){CMyView * pMyView=(CMyView*)m_SplitterWnd.GetPane(0,1); //此處賦值是錯誤的 ,而應在OnInitialUpdate 中為類變數賦值}
正確方式:
void CMainFrame::OnInitialUpdate(void){pMyView=(CMyView*)m_SplitterWnd.GetPane(0,1);}