2015-02-18 10 views
7

Sto provando a creare una schermata di caricamento per il mio progetto OpenGL e ho letto che per farlo funzionare correttamente era meglio usare il threading. Sto cercando di chiamare la mia funzione con il mio thread, ma continuo a ricevere questi errori:Come si usa il threading in una classe?

errore C2064: Il termino non restituisce una funzione di prendere 3 argomenti

IntelliSense: nessuna istanza di costruttore "std :: :: filo filo" corrisponde ai tipi di argomenti lista degli argomenti sono: (void (* schermo newScreen, activeVisuals bool, activeControls bool), PlayScreen *, bool, bool)

Questo è il mio codice:

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

Assicurati di aver capito come funziona il threading con OpenGL. Non so che tipo di risorse si sta caricando, ma è possibile che si verifichino problemi di sincronizzazione CPU/GPU se si utilizzano più contesti di rendering che condividono risorse o memoria di memoria map/unmap. –

+0

@ AndonM.Coleman Sì, sembra che stia avendo problemi a far funzionare le cose con il threading. Continua a generare eccezioni che non riesco a trovare alcuna informazione su come: eccezione non gestita a 0x00E9E2C9 in [nome programma] 0xC0000005: posizione di scrittura violazione di accesso 0x00000020. – WhyYouNoWork

risposta

5

È necessario passare un parametro aggiuntivo che è un'istanza della classe la cui funzione membro è stata passata come primo argomento.

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

Il parametro aggiuntivo è necessario perché questo è ciò che in realtà chiama LoadNewScreen.

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

È un _pointer_ su un'istanza. –

+0

@LightnessRacesinOrbit Beh, non è necessario passare un puntatore, ma in questo caso sì. – Axalo

+0

Questo l'ha fatto compilare. Grazie per la risposta. Perché ha bisogno dell'istanza aggiuntiva? – WhyYouNoWork

1

È necessario fornire std::thread(Function &&f, Args&&... args) una Lambda o un puntatore funzione.

Change

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

Per

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

O un Lambda, se avete bisogno di un riferimento al puntatore this.

+0

Non dimenticare il puntatore all'oggetto mancante. –

+0

Ho provato questo prima di rispondere. Causa il mio primo errore che ho elencato – WhyYouNoWork

+1

Questo perché hai dimenticato il puntatore all'oggetto mancante. –