關於this指標的傳遞問題總結
1:__cdecl成員函式 通過ecx傳遞this指標
mov ecx, 物件的位址
call 成員函式
2:__stdcall成員函式 通過堆疊傳遞this指標
push 物件的位址
call 成員函式
用非靜態成員作為執行緒函式
原理分析:
1.該執行緒的主函式為類的非靜態成員函式,所以它認為他的呼叫者會為他傳遞乙個this指標,通過堆疊傳遞.因為__stdcall的函式
2.而作業系統認為的執行緒主函式只有乙個引數通過堆疊傳遞.
所以執行緒的this指標被&b覆蓋了,剛好把非靜態成員函式作為執行緒主函式
class cobject
;dword winapi threadfuc()
;private:
int m_ndata;
};typedef dword ( cobject::*mythread)(
lpvoid lpthreadparameter
);int main(int argc, char** argv)
以上內容**vckbase,經過測試,可以正常執行。
使用時注意一下幾點:
1.如果使用afxbeginthread,強制轉換的型別應該是afx_threadproc
以下是我使用時候的**:
typedef uint ( cdlgmutex_test::*wolf_htreadproc)(lpvoid);
wolf_htreadproc mythread1 = (wolf_htreadproc)&cdlgmutex_test::thread1;
wolf_htreadproc mythread2 = (wolf_htreadproc)&cdlgmutex_test::thread2;
afxbeginthread(*(afx_threadproc*)&mythread1,this);
afxbeginthread(*(afx_threadproc*)&mythread2,this);
用非靜態類成員函式作為執行緒函式
非靜態的類成員函式是不能直接作為執行緒函式的,如果把成員函式宣告為靜態,可以解決問題,但是靜態函式只能訪問類 的靜態成員,這又帶來很多麻煩。不過可以通過包裝解決此問題,如下 class test private void func 實際需要作為執行緒函式的函式 public static unsin...
類的非靜態成員函式作為執行緒函式的注意事項
include include include include class cthreadclass void threadtest int main 只有建構函式對m stop進行了初始化操作 原因threadtest函式例項化cthreadclass,建立執行緒,當threadtest呼叫結束的...
C 靜態成員函式訪問非靜態成員
如果類沒有被建立,則沒有對應的成員,也就無法訪問 下面這種方法需要先建立類,並將類作為引數傳遞給靜態成員函式才能訪問。include using namespace std class person class student public person static void get age st...