Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Candidat au titre de Membre du Club
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 70
    Points : 14
    Points
    14

    Par défaut Comportement étrange SDL_PollEvent - Multithread

    Bonjour, je pensais enfin pouvoir commencer mon projet pour de vrai, mais je suis tombé sur une erreur que je n'arrive même pas à comprendre pourquoi elle est là Oo

    Voici le code concerné:

    Events.h:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #pragma once
    #include "..\Header.h"
     
    class Events
    {
    protected:
    	char key[SDLK_LAST];
    	int mousex,mousey;
    	int mousexrel,mouseyrel;
    	char mousebuttons[8];
    	char quit;
     
    	Events();
    	~Events(){}
     
    public:
    	void updateEvents();
    	inline char& Key(int i){return key[i];}
    	inline int MouseX(){return mousex;}
    	inline int MouseY(){return mousey;}
    	inline int MouseXrel(){return mousexrel;}
    	inline int MouseYrel(){return mouseyrel;}
    	inline int MouseButton(int i){return mousebuttons[i];}
    	inline int Quit(){return quit;}
    };
    Events.cpp:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #include "Events.h"
     
    Events::Events(void)
    {
    	memset(this,0,sizeof(*this));
    }
     
    void Events::updateEvents(){
     
    	SDL_Event event;
            mousebuttons[SDL_BUTTON_WHEELUP] = 0;
            mousebuttons[SDL_BUTTON_WHEELDOWN] = 0;
    	while(SDL_PollEvent(&event))
    	{
    		fprintf(stderr,"1");
    		switch (event.type)
    		{
    		case SDL_KEYDOWN:
    			fprintf(stderr,"2");
    			key[event.key.keysym.sym]=1;
    			break;
    		case SDL_KEYUP:
    			key[event.key.keysym.sym]=0;
    			break;
    		case SDL_MOUSEMOTION:
    			mousex=event.motion.x;
    			mousey=event.motion.y;
    			mousexrel=event.motion.xrel;
    			mouseyrel=event.motion.yrel;
    			break;
    		case SDL_MOUSEBUTTONDOWN:
    			mousebuttons[event.button.button]=1;
    			break;
    		case SDL_MOUSEBUTTONUP:
                if (event.button.button!=SDL_BUTTON_WHEELUP && event.button.button!=SDL_BUTTON_WHEELDOWN)
      			mousebuttons[event.button.button]=0;
    			break;
    		case SDL_QUIT:
    			quit = 1;
    			break;
    		default:
    			break;
    		}
    	}
    }
    Game.h:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #pragma once
    #include "..\Header.h"
    #include "Events.h"
     
    class View :
    	public Events
    {
     
    	#define WIDTH_TILE		   51
    	#define HEIGHT_TILE		   51
        #define WINDOWS_WIDTH      1000
        #define WINDOWS_HEIGHT	   800
    	#define WINDOWS_BPP		   32
     
    protected:
    	SDL_Surface *m_screen;
     
    	View();
    	~View();
    };
    MenuGame.h:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include "..\Base\Modules\Observer_Observable\Observer.h"
    #include "Game.h"
    #include "..\Base\Modules\Thread\Thread.h"
     
    class ControlMenu;
    class Observable;
     
    class MenuGame
    	: public View, public Observer, public Thread
    {
    private:
    	ControlMenu *m_control;
     
    public:
    	MenuGame(ControlMenu *control);
    	void Setup();
        void Execute(void*);
    	void update(Observable*);
    };
    MenuGame.cpp:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include "MenuGame.h"
    #include "..\Model\MenuModel.h"
    #include "..\Control\ControlMenu.h"
     
    MenuGame::MenuGame(ControlMenu *control) : m_control(control)
    {
    }
     
    void MenuGame::update(Observable *model){
    	MenuModel *menu = dynamic_cast<MenuModel*>(model);
     
    	SDL_BlitSurface(menu->getBackground(),NULL,View::m_screen,NULL);
    	SDL_BlitSurface(menu->getCursor(),NULL,View::m_screen,&menu->getPositionCursor());
    }
     
    void MenuGame::Setup(){
    	m_control->assitSetup();
    }
     
    void MenuGame::Execute(void*){
     
     
    	bool continuer= true;
     
    	while(continuer){
     
    		this->updateEvents();
     
     
    		if (Key(SDL_QUIT)){
     
    			continuer=false;
    		}
     
    	}
    }
    Le programme ce lance ainsi : MenuGame est un Thread, sa fonction principale est composé de Setup qui s'occupe d'envoyer les premier paramètre pour l'affichage, suivit de la fonction Run que vous avez sous les yeux, si vous voulez je peut rajouter le module Thread.

    Et quand j’exécute mon programme le fichier stderr contient 1111, ce qui signifie qu'il est entré 4 fois dans la boucle de PolEvent ce qui devrai être possible uniquement si il y a un évènement en attente, hors ce résultat est le même que je martel les touches ou que je ne touche à rien oO
    Quelqu'un aurait une idée de mon problème?
    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de 3DArchi
    Inscrit en
    juin 2008
    Messages
    7 636
    Détails du profil
    Informations forums :
    Inscription : juin 2008
    Messages : 7 636
    Points : 11 672
    Points
    11 672

    Par défaut

    Salut,
    En général, les gens qui écrivent ça en C++ :
    Code :
    1
    2
    3
    4
    Events::Events(void)
    {
    	memset(this,0,sizeof(*this));
    }
    sont interdits de développement. A vie, si la classe est utilisée dans le cadre d'un héritage.

    Blague à part, contrairement au C, en C++ tu as peu de garantie sur le layout mémoire d'une classe. Et cela devient carrément hasardeux dès que tu rajoutes de l'héritage. Utilises directement les listes d'initialisations
    Code :
    1
    2
    3
    4
    Events::Events(void)
    :key(),mousex(0),mousey(0),mousexrel(0),mouseyrel(0),mousebuttons(),quit(0)
    {
    }

    Ensuite, préfères des std::array ou std::vector aux tableau en dur.

  3. #3
    Candidat au titre de Membre du Club
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 70
    Points : 14
    Points
    14

    Par défaut

    ah tiens c'est la première version que j'avais faîte ^^

    en faîte je ne connais pas vraiment la fonction memset, mais vu ce que tu dis je suppose quelle n'est pas compatible avec tous les objets ^^
    Et bien merci je prend note et je modifie ça pour voir

  4. #4
    Responsable 2D/3D/Jeux

    Avatar de LittleWhite
    Homme Profil pro Alexandre Laurent
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    14 436
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexandre Laurent
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 14 436
    Points : 67 640
    Points
    67 640

    Par défaut

    Bonjour,

    Dans la documentation de SDL_PollEvent() :
    As this function implicitly calls SDL_PumpEvents, you can only call this function in the thread that set the video mode.
    Si je traduis bien, ça donne :
    Comme cette fonction appelle implicitement SDL_PumpEvents, vous pouvez appeler cette fonction uniquement dans le thread qui définit le mode vidéo
    Le thread qui définit le mode vidéo c'est celui qui appelle SDL_SetVideoMode().

    Je pense que cela explique votre problème.
    Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
    La rubrique a aussi un blog !

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Candidat au titre de Membre du Club
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 70
    Points : 14
    Points
    14

    Par défaut

    aie aie aie, merci beaucoup
    je crois que les tutoriels ne sont plus vraiment suffisant, la documentation officielle va mettre plus que utile ^^"
    Désolé de ne pas avoir pensé allé voir, pas le réflexe et cette erreur me faisait bizarre =/

    fin bon merci à tous ^^

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •