2014-03-26 282 views
2

用C++多線程11所以,我的問題是這樣的:非靜態成員函數

  • 我有一個叫NetworkInterface類正在使用RakNet網絡庫建成。
  • 它包含一個使用RakNet用來發送和接收數據的while循環的方法。

現在,我做了NetworkInterface類單身,因爲我希望它只是在我的遊戲我在寫有一次。

但是,如果我只是用while循環調用方法,它會阻止我的整個gqme,所以這就是爲什麼我希望它在不同的線程上運行,所以它不會干擾遊戲機制。 現在,我使用std :: thread對象在另一個線程上的NetworkInterface中啓動該方法,但它拋出了C3867錯誤,該錯誤聲明該方法需要是靜態的或某種類型的(我已經在Google上找到了這個),但我不知道不知道如何解決這個問題,因爲我在該方法中使用的變量不能是靜態的。

我希望這很清楚。簡而言之,我將如何在我的程序的單獨線程中實現來自類的非靜態方法。或者,還有更好的方法? (如果彈出,我不想使用Boost庫)

回答

4

您需要爲您提供一個對象來調用非靜態成員函數,就像您自己不能調用method()一樣。要提供該對象,請在將函數放在參數後傳遞給std::thread的構造函數。

struct Test { 
    void func(int x) {} 
}; 


int main() { 
    Test x; 
    std::thread t(&Test::func, &x, 42); 
    t.join(); 
} 

LIVE EXAMPLE

請注意,我已經通過&x。這是因爲非靜態類函數接受指向它被調用的對象的指針,並且該指針是指針this。其餘部分是42,這個參數對應於方法的參數聲明42與示例中的int x一致。

+0

我試過了,但它似乎沒有工作。目前我有這個: UpdatePackages x; 的std ::線程T1(UpdatePackages :: FUNC,&x); t1.join(); 但我不能這樣做,顯然這是在保持UpdatePackages類方法的類的構造函數(對不起我。不能改變註釋的格式) – Dries

+0

@Dries你應該傳遞'this'而不是創建另一個對象,當然你想從'this'調用一個方法,對嗎?它會在另一個線程上運行,但它有這個原理和明白地調用一個方法一樣''std :: thread t1(&UpdatePackages :: func,this);' –

+0

是的,所以我現在改了它,唯一的錯誤就是'&UpdatePackages :: func'。說'名字後跟::必須是一個類或命名空間名',我是否需要包含一些東西來使用':: func'? – Dries

相關問題