2015-02-18 33 views
7

OpenGL projem için bir yükleme ekranı oluşturmaya çalışıyorum ve düzgün çalışmasını sağlamak için bunu iş parçacığı kullanmak en iyisi olduğunu okudum. Benim iplikle benim işlevi çağırmak çalışıyorum ama bu hataları almaya devam:Bir derste iş parçacığını nasıl kullanırım?

hata C2064: terim 3 argümanlardır

IntelliSense'i alarak bir işleve değerlendirmek değildir: yapıcı hiçbir örnek "std :: iplik :: iplik" ile eşleşir argüman listesi argüman türleri şunlardır: (void (Ekran * newScreen, bool activeVisuals, bool activeControls), Oynatma ekranında *, bool, bool)

Bu benim kodudur:

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

Bunu yaparken iş parçacığının OpenGL ile nasıl oynandığını anladığınızdan emin olun. Ne tür kaynaklar yüklediğinizi bilmiyorum, ancak kaynakları paylaşan veya harita/unmap arabellek belleğini paylaşan çok sayıda render bağlamı kullanıyorsanız, CPU/GPU eşitleme sorunları yaşayabilirsiniz. –

+0

@ AndonM.Coleman Evet Bir şeyleri iş parçacığı ile çalışmak için sorun yaşıyor gibi görünüyor. Böyle bir bilgiyi bulamadığım istisnalar atmaya devam ediyor: [program adı] 'nda 0x00E9E2C9'da işlenmeyen özel durum 0xC0000005: Erişim ihlali yazma konumu 0x00000020. – WhyYouNoWork

cevap

5

Üye işlevinin birinci bağımsız değişken olarak geçtiği sınıfın bir örneği olan ek bir parametre iletmeniz gerekir. Bu aslında LoadNewScreen dediği çünkü

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

ek parametre gereklidir.

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

Bir örneğe _pointer_. –

+0

@LightnessRacesinOrbit Bir işaretçiyi geçmeniz gerekmez, ancak bu durumda, evet. – Axalo

+0

Bu derlemeyi başardı. Cevap için teşekkür ederim. Neden ek örneğe ihtiyaç duydu? – WhyYouNoWork

1

std::thread(Function &&f, Args&&... args) Lambda veya İşlev İşaretçisi vermeniz gerekir.

Değişim

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

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

Veya Lambda'ya için, this pointer bir başvuru gerekiyorsa.

+0

Eksik nesne işaretçisini unutma. –

+0

Bunu cevaplamadan önce denedim. Bu benim ilk hataya neden oldu – WhyYouNoWork

+1

listelenen Bu neden eksik nesne işaretçisi unuttun. –

İlgili konular