2015-02-18 11 views
7

Próbuję utworzyć ekran ładowania dla mojego projektu OpenGL i przeczytałem, że aby działał poprawnie, najlepiej było używać wątków. Próbuję zadzwonić do mojej funkcji z mojego wątku, ale wciąż otrzymuję te błędy:Jak używać wątków w klasie?

błędu C2064: termin nie ocenia do funkcji biorąc 3 argumenty

IntelliSense: nie Instancji konstruktora „STD :: :: gwint gwint”pasuje typy argumentów Argument lista są: (void (Ekran * newScreen, activeVisuals bool, activeControls Bool), ekranie odtwarzania *, bool, bool)

to jest mój kod:

//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

Upewnij się, że rozumiesz, w jaki sposób odtwarzanie wątków jest odtwarzane za pomocą OpenGL. Nie wiem, jakiego rodzaju zasoby ładujesz, ale możesz napotkać problemy z synchronizacją procesora/procesora graficznego, jeśli używasz wielu kontekstów renderowania, które współużytkują zasoby lub mapują/usuwają pamięć bufora. –

+0

@ AndonM.Coleman Tak, wydaje mi się, że mam problemy z działaniem z wątkami. Ciągle wyrzuca wyjątki, które nie mogą znaleźć żadnych informacji na temat: Nieobsługiwany wyjątek przy 0x00E9E2C9 w [nazwa programu] 0xC0000005: Dostęp do zapisu zapisu lokalizacji 0x00000020. – WhyYouNoWork

Odpowiedz

5

Musisz przekazać dodatkowy parametr, który jest instancją klasy, której funkcja członkowska została przekazana jako pierwszy argument.

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

Dodatkowy parametr jest potrzebny, ponieważ właśnie to wywołuje LoadNewScreen.

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

To _pointer_ do instancji. –

+0

@LightnessRacesinOrbit Cóż, niekoniecznie musisz podać wskaźnik, ale w tym przypadku tak. – Axalo

+0

To zmusiło go do kompilacji. Dziękuję za Twoją odpowiedź. Dlaczego potrzebował dodatkowej instancji? – WhyYouNoWork

1

Musisz podać std::thread(Function &&f, Args&&... args) Lambda lub wskaźnik funkcji.

Zmień

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

Aby

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

lub Lambda jeśli trzeba odniesienie do wskaźnika this.

+0

Nie zapomnij o brakującym wskaźniku obiektu. –

+0

Próbowałem tego przed odpowiedzią. Powoduje to mój pierwszy błąd, który wymienię na liście – WhyYouNoWork

+1

To dlatego, że zapomniałeś o wskaźniku brakującego obiektu. –

Powiązane problemy