Static 靜態成員函式與多執行緒
執行緒函式是一個全域性函式,控制元件類要和執行緒函式以及放在控制元件視窗上的CPlayer視窗類之間交換資料的時候用的都是【public static 變數】或者【全域性變數】,而這樣變數是程序內唯一的,因此這就導致瞭如果用某個這樣的變數去讓播放執行緒暫停的時候,其他執行緒也會知道這個變數的值改變了,所以也會受到影響,下一步的思路就是要解決這些變數,全部改為非靜態成員變數,這就要看怎麼和執行緒函式以及其他類交換資料。
執行緒函式改為控制元件類的成員函式,但是又必須是static函式,這樣static函式只能訪問static變數和static成員函式,不符合要求。 那麼把執行緒函式改為控制元件類的【友元函式】呢? 這樣倒是可以,但是怎麼交換資料呢,有了,就是在_beginthreadex函式中函式引數中傳入this指標......
靜態成員函式沒有this指標,所以在C++裡,多執行緒函式只能跑靜態資料成員。
類的靜態函式不屬於該類的任何一個物件,而是屬於類本身,所以不受物件區域性變數的影響,在執行時可以直接呼叫類的靜態函式,從而啟動執行緒!
相反,如果一個類的一個區域性物件的生命週期結束了,難道執行緒函式就不能用了嗎?
class CMyTest { public: CMyTest(); ~CMyTest(); DWORD Start(); static DWORD WINAPI ThreadFun(LPVOID); // .... }; void main() { CMyTest test; }
其實類的靜態函式就跟全域性函式是一個樣子的, 只是呼叫的時候要加下個類修飾符而以.
至於為什麼不能是非靜態成員函式呢, 因為非靜態成員函式都會在引數列表中加上一個this指標為為引數, 這樣的話你寫的執行緒函式就不符合呼叫規定了.
比如 DWORD WINAPI ThreadFun(LPVOID); 是非靜態的,實際編譯後,就會變成
DWORD WINAPI ThreadFun(LPVOID, CMyClass *this);
這個函式就明顯不能作為執行緒的函數了, 因為多了個引數.所以編譯就過不了了.