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 :

Problème d'échange de messages


Sujet :

SDL

  1. #1
    Membre régulier
    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
    Points : 99
    Points
    99
    Par défaut Problème d'échange de messages
    ha&ha ca m'apprendras a debugger a 3h du mat :o

    Apres avoir initier mes threads, je fais ceci:


    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
    void Window::prout()
    {
        SDL_Delay(3000);
     
        int val;
    	SDL_Event ue;
    	ue.type = SDL_USEREVENT;
    	ue.user.code = 0;
        ue.user.data1 = (void*)0xcafebabe;
        ue.user.data2 = 0;
        SDL_LockMutex(Threads::GUIEventLock());
        while ((-1 == (val = SDL_PushEvent(&ue))))
        {
            SDL_CondWait(Threads::GUIEventWait(), Threads::GUIEventLock());
        }
        SDL_UnlockMutex(Threads::GUIEventLock());
        SDL_CondSignal(Threads::GUIEventWait());
    }
    donc normalement il doit envoyer le "ue" au thread pour qu'il execute cette ligne:

    printf("GUI THREAD: data1=%d\n", (int)ue.user.data1);

    jmattendais pas a un miracle mais bon

    Le programme ne bug plus du tout :o, il fait simplementg rien du tout!

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Tu recrees les membres statiques a chaque creation d un Thread.

  3. #3
    Membre régulier
    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
    Points : 99
    Points
    99
    Par défaut
    Je suis pas sur de tout comprendre
    Elles sont crees quand je fais new threads();
    Pas plusieurs fois!
    Ou sont elles recreees?!

  4. #4
    Membre régulier
    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
    Points : 99
    Points
    99
    Par défaut
    Alors la source du probleme est:

    SDL_Delay(3000);

    J'ai enlevé ce delay, rajouté un MessageBox(); dans Windows::prout();
    Ainsi que ceci, dans le thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            switch(ue.type)
            {
                case SDL_USEREVENT:
                    char *ppp;
                    sprintf(ppp, "GUIThread: UserEvent trigger; data=%d",(int)ue.user.data1);
                    MessageBox( NULL, ppp, "Warning", MB_OK );
                    printf("GUI THREAD: data1=%d\n", (int)ue.user.data1);
                    break;
            }
    Et j'ai bien l'alerte !

    Je comprend pas, en revanche, pouquoi SDL_Sleep faisait bugger tout ca.
    Quelqu'un a une expliquation ?

    Maintenant pour tester ce code dans de vraies conditions, la fonction prout va envoyer 20 messages a la suite. Le but etant que le thread bosse tranquilement ^^

    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
    void Window::prout()
    {
        MessageBox( NULL, "windows::prout", "Warning", MB_OK );
        int val;
    	SDL_Event ue;
    	for(int i=0; i < 20; ++i)
    	{
    	    MessageBox( NULL, "windows::iteration", "Warning", MB_OK );
            ue.type = SDL_USEREVENT;
            ue.user.code = 0;
            ue.user.data1 = (void*)i;
            ue.user.data2 = 0;
            SDL_LockMutex(Threads::GUIEventLock());
            while ((-1 == (val = SDL_PushEvent(&ue))))
            {
                SDL_CondWait(Threads::GUIEventWait(), Threads::GUIEventLock());
            }
            SDL_UnlockMutex(Threads::GUIEventLock());
            SDL_CondSignal(Threads::GUIEventWait());
    	}
    }
    et voici le thread, modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int GUIThread(void *nothing)
    {
        SDL_Event ue;
        char *ppp;
        while(WaitEvent(&ue, Threads::GUIEventWait(), Threads::GUIEventLock()))
        {
            if(ue.type == SDL_USEREVENT)
            {
                sprintf(ppp, "GUIThread: UserEvent trigger; data=%d",(int)ue.user.data1);
                MessageBox( NULL, ppp, "Warning", MB_OK );
            }
        }
        return 0;
    }
    Ca marche bien

    Maintenant j'ai plus qu'a tester si mon thread qui gere les SDL_USEREVENT marche, meme si dans mon main, j'ai aussi un SDL_PollEvent, pour le clavier et la souris ^^

    Bref, si quelqu'un arrive a m'eclairer sur le SDL_Delay, je suis peneur :

Discussions similaires

  1. [C#] Problème d'échange de message windows entre deux applications winforms
    Par ingenieurtunisien dans le forum Windows Forms
    Réponses: 1
    Dernier message: 18/03/2011, 22h07
  2. [Outlook 2003] Problème d'envoie de message.
    Par bilb0t dans le forum Outlook
    Réponses: 12
    Dernier message: 18/05/2006, 11h45
  3. Petit probléme pour faire un message d'erreur
    Par mygwel dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 16/05/2006, 17h32
  4. Réponses: 11
    Dernier message: 25/11/2005, 09h52
  5. problème envoie d'un message postcommand()
    Par semenzato dans le forum MFC
    Réponses: 4
    Dernier message: 13/01/2004, 17h26

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