IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Comportement étrange SDL_PollEvent - Multithread


Sujet :

SDL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 79
    Points : 49
    Points
    49
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    En général, les gens qui écrivent ça en C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 79
    Points : 49
    Points
    49
    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
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    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

    Ma page sur DVP
    Mon Portfolio

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

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 79
    Points : 49
    Points
    49
    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.

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo