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 :

[DEBUTANT] Deux processus en parallèle ?


Sujet :

Threads & Processus C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut [DEBUTANT] Deux processus en parallèle ?
    Bonjour à tous,

    Je suis confronté à un petit problème. Voilà, je construis actuellement une sorte de jeu Pong assez simple en utilisant le C++ et la SDL. Dans mon main(), j'utilise un switch pour gérer le mouvement des deux raquettes (en même temps.) Et c'est bien là le problème : il est impossible aux deux joueurs d'effectuer une action en même temps (cas par exemple où le joueur 1 appuie sur la touche A pour monter et le joueur 2 sur la touche M pour descendre : aucune des deux raquettes ne peut alors bouger...)

    Je pense que le blocage provient du fonctionnement même du switch qui teste des valeurs les unes après les autres et non simultanément...

    En C je me serait dis : utilise donc des processus (fork()) à la création du programme (un pour chaque raquette) et je pense que ça pourrait marcher... Cependant comment faire en C++ ?

    Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    euh, avec deux processus, il faudra les faire communiquer lourdement pour qu'ils puissent s'échanger les actions des joueurs...
    Remarque, avec ça, tu pourras peut-être faire un pong en réseau...

    Une autre solution serait de tester directement l'état des touches au lieu de demander "quelle touche a été tapée", mais ce n'est malheureusement pas possible en C++ standard.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    En utilisant la SDL tu peut avoir l'état des touches. J'utilise ce systheme pour gèrer le clavier. Voici un exemple :

    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
     
    //Dans main :
        while (!W_SDL_done)
        {
            SDL_Event event;
     
            //Renvoi au fonctions de gestion
            while (SDL_PollEvent (&event))
            {
                switch (event.type)
                {
                case SDL_KEYDOWN:
                case SDL_KEYUP:
                    keyboard();
                    break;
                case SDL_QUIT:
                    W_SDL_done = 1;
                    break;
                case SDL_MOUSEMOTION:
                case SDL_MOUSEBUTTONDOWN:
                case SDL_MOUSEBUTTONUP:
                     mouse();
                     break;
                default:
                    break;
                }
            }
     
            //Dessin de l'écran
            draw ();
        }
    ///////////////////////////////////////////
    //////////// Fonction clavier ///////////
    //////////////////////////////////////////
    void keyboard()
    {
    //Tableau de oute les touches :
        Uint8 *KEYS_S = SDL_GetKeyState(NULL);
    //Je teste si la touche Escape est enfoncer :
        if(KEYS_S[SDLK_ESCAPE])
          W_SDL_done = 1;
    }
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    je crois qu'en parlant de créer deux processus il voulait parler de deux threads d'un même processus. Car si c'est le cas le mouvement de chaque raquette peut être créé par des thread différents.

    Et donc il faudra géré la communication entre les threads de ton unique processus (ton jeux de ping-pong)

    Il y a des apis pour la création des threads mais je n'ai en tête que des apis MFC.

  5. #5
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    SDL gère les Thread. Cf : http://www.megastep.org/SDL/progsdl1.html
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    J'ai bien réfléchi au problème et je viens vous exposer un premier jet : voila ma fonction move exécutée par chacun des deux processus :

    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
     
    int move(void *data){
    	const Barre nb = *reinterpret_cast<Barre*>(data); 
    	if (nb == j1){
    		while(1){
    			SDL_PollEvent(&event);
    			if (event.type == SDL_KEYDOWN){
    				switch (event.key.keysym.sym){
    					case SDLK_w : j1.moveUp(); break; 
    					case SDLK_s : j1.moveDown(); break;
    					default : break;
    				}
    			}
    		}
    	}
    	else if (nb == j2){
    		while(1){
    			SDL_PollEvent(&event);
    			if (event.type == SDL_KEYDOWN){
    				switch (event.key.keysym.sym){
    					case SDLK_UP : j2.moveUp(); break; 
    					case SDLK_DOWN : j2.moveDown(); break;
    					default : break;
    				}
    			}
    		}
    	}
    	return 0;
    }
    J'appelle cette fonction deux fois juste avant la boucle infinie du jeu, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	tj1 = SDL_CreateThread(move,&j1); // initialisation
    	tj2 = SDL_CreateThread(move,&j2); // des threads
    j1 et j2 sont mes raquettes...

    Puis je kill mes processus dès qu'on est sorti de cette boucle infinie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	SDL_KillThread(tj1); // destruction
    	SDL_KillThread(tj2); // des threads
    Le problème c'est qu'en jeu, j'aimerais appuyer sur la touche ESCAPE pour quitter le jeu mais je ne vois vraiment pas comment faire...

    De plus, j'observe quelque chose d'étrange : mes raquettes se déplacent plus vite (bizarre alors que je n'ai rien changé à la variable de déplacement) de manière saccadée (plus qu'avec mon ancienne version sans les processus en parallèle) et j'ai l'impression que les déplacements sont toujours gérés l'un après l'autre (on ne peut pas monter la raquette de gauche et descendre celle de droite simultanément par exemple, dans ce cas l'une se bloque pendant que l'autre bouge ...)

    Si quelqu'un peut me dépanner je l'en remercie d'avance.

    Alex

  7. #7
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 62
    Par défaut
    Salut,

    Pour faire un jeu, la bonne solution serait de redefinir tes interruptions clavier.

    C'est très arcaïque, mais très redoutable!

    Cathar_Rhythm ->

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    C'est une technique DOS 16 bits, on est passé à autre chose depuis

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    Dans un programme de jeu on utilise trés peu les threads, et surtout dans ton cas il n'y en a pas besoin. Il suffit de gérer toi meme les touches du clavier : tu geres un simple tableau de booleens par exemple,un pour chaque touche. Qd tu reçois l'evenement d'une touche appuyée, tu sauvegardes cet etat, idem qd la touche est relachée. Puis dans la boucle principale de ton jeu tu testes simplement l'etat de tes touches dans ton tableau, et tu effectues des actions en conséquences.

  10. #10
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Sphax j'avoue qu'un petit exemple me permettrais d'y voir un peu plus clair... Parce que ta méthode me parait difficile à mettre en place.

  11. #11
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    a priori dans un jeu tu passes en boucle dans la methode de rafraichissement pour changer le status et l'Affichage de tes raquettes, donc l'Action sur tes touches de clavier ne doit que changer le status de tes raquettes et l'affichage se fais apres donc ca ne devrait pas poser de probleme.

    Donc normalement tes fonctions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                switch (event.key.keysym.sym){
                   case SDLK_w : j1.moveUp(); break;
                   case SDLK_s : j1.moveDown(); break;
                   default : break;
                }
    doivent juste changer l'Etat de tes variable et non pas rafraichir l'image. Est ce que c'est bien ce que tu as fais ?

    XXiemeciel

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Oui c'est exactement ce que j'ai fait !

Discussions similaires

  1. exécution parallèle de deux processus
    Par koko31 dans le forum C
    Réponses: 6
    Dernier message: 15/05/2013, 16h07
  2. [Débutant] Deux tableaux sur une page
    Par rockelite dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 23/09/2006, 14h43
  3. Installation deux version en parallèle
    Par turcotm dans le forum Installation
    Réponses: 2
    Dernier message: 19/05/2006, 11h21
  4. [debutant] deux boutons pour soumettre un formulaire.
    Par rvfranck dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/12/2005, 20h52
  5. [debutant] les processus se cumulent
    Par glurps dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 17/06/2003, 10h24

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