2010-05-17 85 views
4

我有以下:奇怪C++線程功能調用

class DThread 
    { 
     virtual void run()=0; 

    _beginthreadex(NULL,0,tfunc,this,0,&m_UIThreadID); // class itself being passed as param to thread function... 

    static unsigned int __stdcall tfunc(void* thisptr) 
     { 
      static_cast<DThread*>(thisptr)->run(); 
      return 0; 
     } 

//other stuff 

} 

的運行功能由派生類中實現。

爲什麼在線程中被調用的函數被通過鑄造this指針調用?這是好的做法嗎?

不能直接調用嗎?

需要運行的實際功能在派生類中。

我的問題是

+2

你的問題是...? – Anthony 2010-05-17 12:22:45

+0

爲什麼在線程中調用的函數是通過強制轉換這個指針來調用的?這是好的做法嗎? 不能直接調用嗎? – 2010-05-17 12:23:26

+1

靜態成員函數中沒有「this」。 – eemz 2010-05-17 12:38:23

回答

2

大多數平臺級別的線程API都是簡單的C語言,並且需要一個普通的指針才能在新線程中運行。這意味着在C++中,函數必須是自由函數或靜態成員。這些都不能訪問任何類實例。構建有狀態線程類的解決方法是利用線程創建調用的附加「傳遞」參數(這通常是稍後傳遞給在新線程中執行的函數的指針),併爲其指向類本身,即this。然後靜態函數可以調用[虛擬]成員,比如run()或類似的東西。

3

線程函數不是'class-aware'。您的實現使它們具有類的意識,以便派生的「運行」功能可以訪問類成員。

1

_beginthreadex函數是一個C函數。它對C++一無所知。要從線程函數內部訪問C++成員,您需要對其進行強制轉換。

4

_beginthreadex需要一個(stdcall)C風格函數,它不能使用C++成員函數,因爲它不知道C++。獲取成員函數的方法是將一個指針傳遞給一個對象,並調用該函數內的成員函數。這樣的功能通常被稱爲蹦牀。