今天寫程序要用到一個計時器,然后需要創建一個新的線程,這個線程是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間接使用成員變量。
}
static UINT ThreadProc(LPVOID pParam)
{
Your_Class *p=(Your_Class *)pParam;
//然后用p間接使用成員變量。
}
線程函數是回調函數,因此它必須是靜態成員函數或者是類外部聲明的全局函數。