線上程中執行類成員變數

來源:互聯網
上載者:User

   一般,線程都是全域函數,那要想線上程中使用類成員函數怎麼辦呢?

   解決途徑是: 將類的指標作為參數 傳遞給線程函數。

  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);}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.