用靜態成員函數調用非靜態成員變量


今天寫程序要用到一個計時器,然后需要創建一個新的線程,這個線程是CtestDLG的一個成員函數,必須定義為靜態的.但是這個時候就不能去訪問非靜態成員變量了,這里找到一個很好的解決辦法:

先上代碼:

1.線程函數的定義:

private:
    int Count_time;
    CTime C_time;
    bool GetQuestion();
    int mark;//考試分值,五個題目,一個20分,滿分100
    int QS[5];//隨機題庫序號
    int count2;//題庫總數
    int count_Q;//當前輸出的題目數量
    static DWORD WINAPI Fun_Time(LPVOID lpParameter);
};

我們可以看到這個是一個類的成員函數

2.創建線程

void CTESTDlg::ONTIME()
{
    HANDLE pThread_time = NULL;
    pThread_time = CreateThread(NULL,0,Fun_Time,this,0,NULL);
}

這個是在一個消息函數中創建的.第四個參數傳遞的是一個this指針,指向當前的窗口類(這里很重要)

2.具體實現

DWORD WINAPI CTESTDlg::Fun_Time(LPVOID lpParameter)
{
    CTESTDlg* temp = (CTESTDlg*)lpParameter;
    temp->Count_time++;
    while(1)
    {
        AfxMessageBox("s");
    }
    return 0;
}

這里我們可以看到,窗口句柄傳遞過來,然后通過強制類型轉換,將它復制給一個新的臨時變量,然后用這個臨時的指針就可以去訪問類的成員了.很好的一個解決辦法!!

思想的總結如下:

創建線程時,線程函數如果要設置成類的成員函數,則必須是靜態成員函數,在此函數種不能使用非靜態成員變量,如果要使用非靜態成員變量,則一種比較適合線程的方法是:建立線程的時候把this作為CreateThread的一個參數(即第4個參數,就是那個LPVOID型的),然后線程里就對應pParam,例如:
static UINT ThreadProc(LPVOID pParam) 

     Your_Class *p=(Your_Class *)pParam; 
     //然后用p間接使用成員變量。 
   }

線程函數是回調函數,因此它必須是靜態成員函數或者是類外部聲明的全局函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM