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

今天寫程序要用到一個計時器,而後須要建立一個新的線程,這個線程是CtestDLG的一個成員函數,必須定義爲靜態的.可是這個時候就不能去訪問非靜態成員變量了,這裏找到一個很好的解決辦法:函數

先上代碼:this

1.線程函數的定義:spa

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指針,指向當前的窗口類(這裏很重要)code

2.具體實現blog

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

這裏咱們能夠看到,窗口句柄傳遞過來,而後經過強制類型轉換,將它複製給一個新的臨時變量,而後用這個臨時的指針就能夠去訪問類的成員了.很好的一個解決辦法!!回調函數

思想的總結以下:io

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

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

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

相關文章
相關標籤/搜索