精華區beta C_and_CPP 關於我們 聯絡資訊
ccc 剛剛看到了cplusplus說的關於static member function跟non-static member funciton 讓我想到了一件事 其實類別中的static member function跟一般的member function是完全不一樣的 除了大家所熟知的static member function不需要產生物件就能直接使用之外 還有很重要的一點 所有class的member function都會被編譯器隱含的加入一個this指標 但是static member function不會被隱含的加入this 原因很明顯 因為static的東西不用產生object就能使用 哪來的this 呵呵呵 現在問題來了 如果你要用CreateThread這個api去指定一個定義在class中的function 一定會失敗 為什麼呢? 因為編譯器對函式指標的型別檢查不會過 CreateThread要求傳入一個函式指標當參數 此函數必須長這樣 DWORD WINAPI ThreadProc(LPVOID lpParameter); 就算你真的把你的函式在class中定義成這樣 也會被編譯器改成 DWORD WINAPI ThreadProc(LPVOID lpParameter, YourClassName *this); 所以編譯的時候不會過 解決的方法一 : 使用global function 方法二 : 把類別中的函式宣告成 static 同理 如果你想要把WindowProc包在class裡面, 也將只有把他宣告成static這個方法 如果你不想用mfc來把每個視窗包成一個物件 而想純粹的寫win sdk 那你就必須把WindowProc包在類別裡面(放在global會很怪 別這樣做) 例如以下這樣 Header: #ifndef C_WCOPYRIGHT_H #define C_WCOPYRIGHT_H #include <windows.h> #include "resource.h" class WCopyRight { HINSTANCE hInst; HWND parentWnd; public: inline WCopyRight(HINSTANCE hInst, HWND parentWnd) { this->hInst = hInst; this->parentWnd = parentWnd; } inline void display() { DialogBox(hInst, "COPYRIGHT", parentWnd, copyRightProc); } static BOOL CALLBACK copyRightProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); }; #endif ============================================= Body: #include "CWCopyRight.h" BOOL CALLBACK WCopyRight::copyRightProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_COPYRIGHT_OK: EndDialog(hwnd, 0); return 0; } default: return 0; } } 以上是敝人的心得 關於cplusplus提到的那個網頁說到了另一個方法 Use a function that is not a class member as the thread function. Make it call the class function member that you want to call in the thread. 老實說這樣做才是真正正統的解決方案 只是這樣有點麻煩 而用static function member這個方式去解決 似乎會有calling convention 的問題 Sometimes one can get away with using static function members as thread functions, even though it is wrong, because it just so happens that by default the same calling convention is used for both "C" and "C++" linkage. But one cannot always get away with this. For example: If one is using IBM VisualAge C++ and one is supplying the -Mt, the -Mc, or the -Ms option to the compiler, the calling convention for "C" linkage is different to t he calling convention for "C++" linkage, and using a static function member as a thread function won't work. 不過敝人是還沒遇過拉 如果遇到的話編譯器選項可能要像上面那樣調 有調過的人請出來分享吧 ^^ ※ 引述《cplusplus (大口小口吃炒飯)》之銘言: : ※ 引述《eugenehsu (Rainy day)》之銘言: : : multiThread用法很簡單 就呼叫一個api而已 : : 看是要用win sdk的CreateThread 還是用crt的_beginthread : 要注意這個兩個方法接受的function type有點不一樣 : 重點是calling convention : _beginthread 是 __cdecl or __clrcall : _beginthreadex 或是 CreateThread 是 __stdcall or __clrcall : 所以寫的時候要注意,C跟C++的預設function calling convention不同 : 不然可能程式會出問題,要注意 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.97.125 ※ 編輯: eugenehsu 來自: 220.133.97.125 (07/10 15:58)
drkkimo:這是物件導向的一些觀念 07/11 00:49