2015-02-18 143 views
7

我正在嘗試爲我的OpenGL項目創建一個加載屏幕,並且已經閱讀了讓它正常工作,最好使用線程。我想打電話給我的功能與我的線程,但我不斷收到這些錯誤:如何在課堂上使用線程?

錯誤C2064:術語不計算爲服用3個參數

智能感知功能:沒有構造函數的實例「STD ::螺紋::線程」相匹配的參數列表 參數類型有:(無效(屏幕* newScreen,布爾activeVisuals,布爾activeControls),播放屏幕*,布爾,布爾)

這是我的代碼:

//LoadingScreen 
class LoadingScreen 
{ 
    LoadingScreen(); 
    void LoadNewScreen(Screen* newScreen, bool activeVisuals, bool activeControls); 
    void Setup(); 
}; 

void LoadingScreen::LoadNewScreen(Screen* newScreen, bool activeVisuals, bool activeControls) 
{ 

} 

void LoadingScreen::Setup() 
{ 
    PlayScreen *playScreen = new PlayScreen(); 
    std::thread first(LoadingScreen::LoadNewScreen,playScreen, true, true);// , playScreen, true, true); 

    first.join(); 
} 

//source.cpp 
LoadingScreen loadingScreen; 
int main() 
{ 
    LoadingScreen loadingScreen = LoadingScreen(); 
    loadingScreen.Setup(); 

    return 0; 
} 
+1

確保您瞭解線程在使用OpenGL時如何使用OpenGL。我不知道你正在加載什麼類型的資源,但是如果你使用共享資源的多個渲染上下文或映射/取消映射緩衝區內存,你可能遇到CPU/GPU同步問題。 – 2015-02-18 01:33:37

+0

@ AndonM.Coleman是的,我似乎無法讓事情與線程一起工作。它一直拋出異常,我無法找到任何信息,例如:[程序名稱] 0x00E9E2C9處理異常0xC0000005:訪問衝突寫入位置0x00000020。 – WhyYouNoWork 2015-02-18 02:58:52

回答

5

你需要傳遞一個額外的參數是其成員函數作爲第一個參數傳遞的類的實例。

std::thread first(&LoadingScreen::LoadNewScreen, this, playScreen, true, true); 
              // ^^^^ <= instance of LoadingScreen 

需要額外的參數,因爲這實際上是調用LoadNewScreen

this->LoadNewScreen(playScreen, true, true); 
+0

這是一個實例的_pointer_。 – 2015-02-18 01:13:46

+0

@LightnessRacesinOrbit那麼你不一定需要傳遞一個指針,但在這種情況下,是的。 – Axalo 2015-02-18 01:15:01

+0

這讓它編譯。謝謝你的答案。爲什麼需要額外的實例? – WhyYouNoWork 2015-02-18 01:16:09

1

您需要爲std::thread(Function &&f, Args&&... args)指定一個Lambda或函數指針。

變化

std::thread first(LoadingScreen::LoadNewScreen,playScreen, true, true); 

std::thread first(&LoadingScreen::LoadNewScreen,playScreen, true, true); 

或λ,如果你需要的this指針的引用。

+0

不要忘記丟失的對象指針。 – 2015-02-18 01:12:20

+0

我在回答之前試過。它導致我列出的第一個錯誤 – WhyYouNoWork 2015-02-18 01:12:43

+1

這是因爲你忘記了丟失的對象指針。 – 2015-02-18 01:13:03