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

Threads & Processus C++ Discussion :

Mutex avec la SDL pour communication main -> thread


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut Mutex avec la SDL pour communication main -> thread
    Bonjour!

    Dans la continuité de mon thread dans C++ > Language, je suis face a un programme qui ne bug pas, mais ne fait rien

    Le but de ce programme:
    J'essaye de faire en sorte que je puisse envoyer des SDL_Event à un thread qui se chargera uniquement de faire le travail graphique ^^

    Voila l'envoi de l'event :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void Window::prout()
    {
    	SDL_Event ue;
    	int a;
    	int b;
    	for(int i=0; i < 20; ++i)
    	{
    	    a = i+99;
    	    b = i*7;
    	    ue = CreateSDLUserEvent(0x01, a, b);
    	    Threads::getInstance()->doGFX(ue);
    	}
    }
    La fonction CreateSDLUserEvent creer un SDL_Event, en mettant les valeurs code, data1 et data2 avec les 3 arguments et retourne le SDL_Event, simplement ^^

    La fonction doGFX:

    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
     
    void Threads::doGFX(SDL_Event ue)
    {
     
        int val;
        SDL_LockMutex(_guiEventLock);
        _buf = &ue;
     
        while ((-1 == (val = SDL_PushEvent(_buf))))
        {
            SDL_CondWait(_guiEventWait, _guiEventLock);
        }
        SDL_UnlockMutex(_guiEventLock);
        SDL_CondSignal(_guiEventWait);
    };

    Et mon thread recupere le event ^^
    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
     
    static int GUIThread(void *nothing)
    {
        SDL_Event ue;
        int order;
        int arg1, arg2;
        char *pp;
        while(WaitEvent(&ue, Threads::GUIEventWait(), Threads::GUIEventLock()))
        {
            if(ue.type == SDL_USEREVENT)
            {
                MessageBox(NULL, "trigger event", "ok", MB_OK);
                order = (int)ue.user.code;
                arg1 = (int)ue.user.data1;
                arg2 = (int)ue.user.data2;
     
                sprintf(pp, "order=%d; arg1=%d; arg2=%d", (int)order, (int)arg1, (int)arg2);
                if(order == T_ORDER_LOADMAP)
                {
                    MessageBox(NULL, pp, "gfx thread (load MAP ORDER !)", MB_OK);
                }
                else if(order == T_ORDER_FADE)
                {
     
                }
                else if(order == T_ORDER_SCREEN)
                {
     
                }
     
            }
        }
        return 0;
    }
    J'avais fait un test sans la fonction doGFX, simplement apres la creation de mon SDL_Event, et ca marchait bien

    Donc en effet, je compile genialement bien, mais le programme fait rien

  2. #2
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Bon apres avoir bosser, jme reconcentre sur mon code, et j'ai trouvé le problème, mais pas la solution

    En effet, j'ai deux loop sur les event SDL

    voici le deuxieme:
    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
     
    void ClientApp::Loop()
    {
        SDL_Event event;
        while(running)
        {
            if( SDL_PollEvent( &event ) )
            {
                if( event.type == SDL_QUIT )
                {
                    running = false;
                }
                if(event.type == SDL_MOUSEBUTTONDOWN)
                {
                      MessageBox( NULL, "mousebutton down", "Warning", MB_OK );
                }
            }
        }
    }
    C'est le loop principal de mon programme.

    Ce que j'aimerais, cest que le loop principal soccupent exclusivement de ce que fait le mec qui lance le programme (souris, clavier)
    Et que mon thread soccupe de faire le travail graphique (calculs; sdl_blit, update, etc.)
    Comment faire pour que mon loop principal soccupent uniquement d'une partie du boulot, et mon thread le reste?


    En regardant sur internet, certaines personnes pensent que mettre le gfx dans un thread separe est mauvais.
    Si c'est vraiment si important, pourquoi ?
    Et si je change, en mettant le graphique dans le main, et le user input dans le threa separé, cela reviens au meme probleme ... ?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Personnellement, j'ai arrêté d'utiliser les SDL_WaitEvent / SDL_PollEvent pour tout ce qui est de récupération des infos du clavier / souris.
    Pour le clavier cela me donne la chose suivante : http://code.google.com/p/openawars/s...L_Keyboard.cpp

    Sinon, dans un code, j'avais mis la gestion des inputs dans un thread séparé et le graphisme dans le thread principal. Il faut bien lire la documentation, car certaines fonctions ne peuvent pas être appelé sur un autre thread (SDL_PumpEvent si je me rappelle bien, fait partie de ses fonctions).
    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.

  4. #4
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Tu nutilises pas de thread pour separer le input des graphismes si je lis bien?
    Et si jinterverti mes boucles, je pense sue jaurais le meme probleme non?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Pas dans le code que je montre, car le code que je montre est juste un exemple pour éviter d'utiliser les SDL_WaitEvent / SDL_PollEvent.
    Sinon, dans mon autre cas j'avais séparé la mise à jour du jeu de la partie graphique. Mais le SDL_PumpEvent() ne pouvait pas être délocalisé.
    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.

  6. #6
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Bon je comprend pas vraiment ton code x)
    Donc je vais mettre ca de cote, faute de cellules grises voulant comprendre!
    Pour commencer, je vais mettre l'integralité des events SDL dans mon thread.
    Dans le main loop, je vais mettre le gestion (future, pas maintenant ^^) des sockets ^^

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/08/2009, 10h48
  2. Réponses: 0
    Dernier message: 11/08/2009, 16h21
  3. Réponses: 10
    Dernier message: 10/07/2009, 13h58
  4. Programmation carte SCM2116 pour communication avec XBT
    Par wulfen80 dans le forum Automation
    Réponses: 10
    Dernier message: 12/05/2009, 14h10
  5. Code VBA pour communication avec un port série dans EXCEL
    Par Fbroom dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/05/2008, 10h14

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