今天寫程序要用到一個計時器,而後須要建立一個新的線程,這個線程是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
線程函數是回調函數,所以它必須是靜態成員函數或者是類外部聲明的全局函數。class