2017-04-17 1 views
0

J'essaie de créer un gestionnaire d'entrée en utilisant le multi-threading avec la librairie SDL2; Cependant, lorsque je tente de mettre un fil dans une classe, il ne compilera pas et me donne cette erreur ...SDL2 Le thread ne fonctionne pas à l'intérieur de la classe

error: cannot convert 'inputHandlerClass::getInput' from type 'int (inputHandlerClass::)(void*)' to type 'SDL_ThreadFunction {aka int (*)(void*)}' 

Je suis assez sûr que son la façon dont je passe le nom de la fonction (fn) à la fonction SDL_CreateThread.

C'est le fichier source.cpp

#include <iostream> 
#include <SDL.h> 
#include <SDL_image.h> 
#include <SDL_ttf.h> 
#include <SDL_thread.h> 
#include <SDL_mixer.h> 
#include "..\include\gameClass.hpp" 
#include "..\include\inputHandlerClass.hpp" 

int main(int argc, char *argv[]){ 
    inputHandlerClass inputHandler; 
    inputHandler.startThread(); 
    std::cout << "hello world"; 
    return 0; 
} 

C'est le inputHandlerClass.hpp

#include <SDL_thread.h> 
#include <iostream> 

class inputHandlerClass{ 
    private: 
     SDL_Thread *thread; 
     int threadReturnValue; 
    public: 
     inputHandlerClass(); 
     int getInput(void *ptr); 
     void startThread(); 
}; 

//Default Constructor 
inputHandlerClass::inputHandlerClass(){ 
    this->thread = SDL_CreateThread(getInput, "inputThread", this); 
} 

int inputHandlerClass::getInput(void *ptr){ 
    int cnt; 
    for(cnt= 0; cnt < 10; ++cnt){ 
     std::cout << "counter: " << cnt << std::endl; 
     SDL_Delay(50); 
    } 
    return cnt; 
} 

void inputHandlerClass::startThread(){ 
    SDL_WaitThread(this->thread, &this->threadReturnValue); 
} 

Répondre

1

SDL_CreateThread attend un pointeur vers une fonction régulière avec la signature int(void *ptr) comme premier paramètre, mais vous fournissez une fonction membre non statique (pas même un pointeur car les fonctions membres ne sont pas converties implicitement en pointeur). Vous devriez redéclarer getInput comme statique. Le pointeur this sera disponible sous la forme ptr.

+0

J'ai essayé de re-déclarer en tant que fonction membre statique, mais maintenant j'obtiens l'erreur suivante. erreur: impossible de déclarer la fonction membre 'static int inputHandlerClass :: getInput (void *)' pour avoir une liaison statique [-fpermissive] –

+0

Peut-être avez-vous modifié la définition de la fonction au lieu de la déclaration? – VTT

+0

J'ai trouvé une solution. J'utilisais le compilateur gnu et quand j'ai donné au compilateur le drapeau -fpermissive, il a ignoré l'erreur et a compilé avec succès. –