非靜態成員作為執行緒函式

2021-05-02 06:30:22 字數 1024 閱讀 8027

關於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...