今天寫程式要用到乙個計時器,然後需要建立乙個新的執行緒,這個執行緒是ctestdlg的乙個成員函式,必須定義為靜態的.但是這個時候就不能去訪問非靜態成員變數了,這裡找到乙個很好的解決辦法:
先上**:
1.執行緒函式的定義:
private:
intcount_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.建立執行緒
voidctestdlg::ontime()
這個是在乙個訊息函式中建立的.第四個引數傳遞的是乙個this指標,指向當前的視窗類(這裡很重要)
2.具體實現
dword winapi ctestdlg::fun_time(lpvoid lpparameter)return0;
}
這裡我們可以看到,視窗控制代碼傳遞過來,然後通過強制型別轉換,將它複製給乙個新的臨時變數,然後用這個臨時的指標就可以去訪問類的成員了.很好的乙個解決辦法!!
思想的總結如下:
建立執行緒時,執行緒函式如果要設定成類的成員函式,則必須是靜態成員函式,在此函式種不能使用非靜態成員變數,如果要使用非靜態成員變數,則一種比較適合執行緒的方法是:建立執行緒的時候把this作為createthread的乙個引數(即第4個引數,就是那個lpvoid型的),然後執行緒裡就對應pparam,例如:
static uint threadproc(lpvoid pparam)
執行緒函式是**函式,因此它必須是靜態成員函式或者是類外部宣告的全域性函式。
靜態成員函式呼叫非靜態成員變數 p
c 會區分兩種型別的成員函式 靜態成員函式和非靜態成員函式。這兩者之間的乙個重大區別是,靜態成員函式不接受隱含的this自變數。所以,它就無法訪問自己類的非靜態成員。在某些條件下,比如說在使用諸如pthread 它不支援類 此類的多執行緒庫時,就必須使用靜態的成員函式,因為其位址同c語言函式的位址相...
C 靜態成員函式訪問非靜態成員
如果類沒有被建立,則沒有對應的成員,也就無法訪問 下面這種方法需要先建立類,並將類作為引數傳遞給靜態成員函式才能訪問。include using namespace std class person class student public person static void get age st...
靜態成員和非靜態成員
類中的成員要麼是靜態的要麼是非靜態的。一般來說,靜態成員都歸屬於類所有,使用 static 關鍵字來宣告,不能在類的例項中訪問靜態成員 非靜態成員屬於類的例項 物件所有,不能按照類訪問靜態成員來訪問。下面用乙個例項來幫助理解 using system using system.collections...