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

MFC Discussion :

Aide sur les Threads


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut Aide sur les Threads
    Encore le petit Moye qui à un problème =)
    Voilà, afin de réliser une sorte de petit jeu basique en réseau(deux ptits vaisseau tout con qui tire des missiles :p), j'utilise des threads...
    Je les utilises afin de pouvoir continuer à bouger mon vaisseau pendan que le missile suit sa trajectoire.
    Mais problème, si je relance un missile, le premier s'arrête (logique puisque je réappel le thread :p)...
    Voilà, j'aimerais savoir quelle technique employer pour qu'à chaque fois que je relance un tire, un nouveau thread ce créé afin de laisser le missile précédent suivre sa route...

    Merci d'avance pour vos réponses ^^

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 189
    Points : 126
    Points
    126
    Par défaut
    Tu utilises quelle methode pour creer tes threads? Sinon une bonne methode est CreateThread.

    Et c'est quoi qui s'arrete, c'est ton missile ou ton thread?

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Mais problème, si je relance un missile, le premier s'arrête (logique puisque je réappel le thread :p)...

    Non je ne trouve pas ça logique. Un thread qui est lancé, est arrêté soit parce que tu l'arrêtes, soit parce qu'il a finit de vivre. Pas parce que tu relances un thread...

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 189
    Points : 126
    Points
    126
    Par défaut
    Moi je pense que ton probleme vient du faite de ta variable qui represente ton missile, es tu sur que dnas chaque thread tu as bien un missile different d'un autre thread???

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par pitch21
    es tu sur que dnas chaque thread tu as bien un missile different d'un autre thread???
    sortie de son contexte cette phrase me fait (note: je me moque pas c'est l'effet un thread = 1 missile )

    sinon je partage l'avis de modalvi.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    J'en mérite des clakes...
    Effectivement, c'est bien les mêm coordonnées du missile que j'utilise à chaque nouvel appel d'un thread...
    Excusez moi d'vous avoir dérangé pour ça...
    (Jle frais plus....enfin vais essayer :p )

    Merci à tous!

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    Bon, c'est encor moi...
    J'ai bien compri le problème du missile, à chaque foi que je rappel un thread, c'est le même missile dont je modifie les coordonnées..
    Mais par contre je ne vois pas du tout comment faire pour qu'à chaque appel de mon thread, les coordonées de mon missile soit différentes..(jle rappel, je débute en programation ^^)
    Mon appel du thread ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case 'v' :
    		xa=x+28;
    		ya=y;
    	DWORD dwThreadId, dwThrdParam = 1; 
    	HANDLE hThread; 
    	hThread = CreateThread( NULL, 0,ThreadFunc,&dwThreadId);
    Donc, kan la lettre lu est 'v', le vaisseau tire un missile géré par l'appel du thread suivant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DWORD WINAPI ThreadFunc( LPVOID lpParam ) 
    { 
    	while(xa <= (getmaxx()))
    	{
    		outtextxy(xa-3,ya," ");
    		outtextxy(xa,ya,"-");
    		xa=xa+3;
    		_sleep(50);
     
    		}
        return 0; 
    }
    Bah le missil c'est un bête tiret affiché aux coordonnées xa,ya...
    La souci, c'est qu'à chaque nouveau thread, le missile a toujours les coordonnées xa, ya...

    Quelqu'un pourai me donner un bout de code qui pourait m'aider à palier ce problème??

    Merci bocoup!!


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 81
    Points : 65
    Points
    65
    Par défaut
    Utilise la variable lpParam pour passer au thread les nouvelles coordonnées de ton missile :

    ThreadFunc( LPVOID lpParam )
    Il suffit de créer une structure avec xa et ya et de passer dans le CreateThread le pointeur sur cette structure.

    Ensuite, dans le corps de ThreadFunc, tu n'utilises plus xa mais *(lpParam.xa)

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    Oki, mici G3G3!
    Jvois à peu près ce que tu veux dire, mai concrètement...
    Je vois pas trop coment faire ça lol...
    J'ai changé un petit peu mon code entre temps, j'utilise maintenant une classe Missile...
    Mais j'ai toujours le même problème, quand je construit mon missile, le nom est toujours le même :

    case 'v' :
    xa=_x+28;
    ya=_y;
    Missile M1(xa,ya);
    M1.affiche();

    Donc, peux tu me détailler un petit peu plus ton histoire de structure s'il te plait G3G3?
    Ou s'il y a un moyen de faire rejoindre tes structures avec mes classes...

    Merci d'avance!

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Petite question très bête: xa et ya, ce ne serait pas des variables globales par hasard.

    Je subodore que tous tes threads affichent leur missile au même endroit

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    Bah on peut dire que c'est des variables globales oui lol...
    Je les déclares dans ma fonction de mouvement du vaisseau, donc tous mes threads n'affiches pas leur missiles au même endroit, mais tous mes thread "reprennent" le même missile...
    Et je vois tout à fais que ça cloche, mais n'étant pas bien doué, je en vois po très bien comment dire à mon thread de créer un nouveau missile à chaque foi...
    C'est ce que je voulais résoudre en me créant une classe Missile, mais le soucis, c'est que dans mon appel du thread, le missile est toujours le même (je fai toujours M1.affiche() pour afficher le missile, kelke soit le nombre de threads que je créé...)

    Merci une nouvelle fois de me donner un bout de code pour me faire comprendre ce que je peux faire ^^

  12. #12
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Peut-être 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
    DWORD WINAPI ThreadFunc( LPVOID lpParam )
    {
     
        cMissile cmissile;
        int xa = lpParam .x;
        int ya = lpParam .y;
     
       while(xa <= (getmaxx()))
       {
          cmissile.dessin(xa, ya);
          xa=xa+3;
          _sleep(50);
     
          }
        return 0;
    }

    G3G3 t'avais déjà mis sur la voie.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    Bah, me revoilà, je n'y arrive toujours pas
    Bon, j'ai voulu faire un peu d'ordre, et donc maintenant je me balade avec des classes...
    Mais je crois que je n'ais vraiment pas tout compris sur les threads lol...pourtant j'ai cherché...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DWORD dwThreadId, dwThrdParam = 1; 
        HANDLE hThread; 
     
        hThread = CreateThread( 
            NULL,                        // attribut de securité par defaut
            0,                             // taille de la pile par defaut
            ThreadFunc,	        // notre function
            &dwThrdParam,         // l'argument pour la fonction
            0,                             // flag de creation par defaut
            &dwThreadId);
    Voilà ce que j'avais trouvé pour m'aider...Mais je ne comprends pas comment passer des paramètres à mon thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Missile::ThreadFunc(Missile M1)
    {
    	M1.affiche();
    }
    Voilà ma fonction k'est sensé appelé mon thread (bon, je l'ai déclaré dans ma classe Missile), et je voudrais que mon thread appel ma fonction d'affichage pour ce missile M1, mais ne sachant pas comment passer des paramètres à mon thread, ça ne marche pas lol...

    donc pour la création de mon thread je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hThread = CreateThread(NULL,0,M1.ThreadFunc,&dwThrdParam,0,&dwThreadId);
    et voilà mon erreur :

    error C2664: 'CreateThread' : cannot convert parameter 3 from 'void (class Missile)' to 'unsigned long (__stdcall *)(void *)'
    Comment je pourrais corriger cela?

    Merci d'avance!

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Peut-être que ceci t'aidera

    http://c.developpez.com/faq/cpp/?pag...onction_membre

    (il y a une petite erreur, il faut rajouter WINAPI dans le prototype des fonctions passées à CreateThread)

  15. #15
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 189
    Points : 126
    Points
    126
    Par défaut
    Oui il y a un probleme a la declaration de la fonction de ton thread, c'est mieux comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UINT FctThread(LPVOID arg);

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    Bon, je n'avance pas lol...
    Alors, pour Loulou24, je suis allé voir la FAQ, mais c'est encore bien sombre pour moi...

    Donc, si j'ai bien compris, dans ma classe Missile, j'ai une fonction à l'origine déclarée come ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ThreadMissile(Missile M1, int xa, int ya);
    C'est la fonction que je voulais passer au thread, qui lui envoyait le missile construit, et les coordonnées aux-quelles le missile devait commencé à être affiché.
    Il faut que je la remplace par :
    static DWORD ThreadMissile(void* Param);
    L'implémentation originale de ma fonction Missile::ThreadMissile était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void Missile::ThreadMissile(Missile M1, int xa, int ya)
    {
    	//Missile M1(xa,ya);
    	M1.affiche();
    }
    Que j'ai remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static DWORD ThreadMissile(void* Param)
    {
    	Missile * Obj = reinterpret_cast<Missile*>(Param); 
    	return Obj->/*ThreadFunc*/ThreadMissile(); 
    }
    Et l'appel de cette fonction dans mon programme est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Missile Param;
     
    DWORD dwThreadId, dwThrdParam = 1; 
    HANDLE hThread; 
     
    hThread = CreateThread(NULL,0,Missile::ThreadMissile,&Param,0,&dwThreadId);
    Mais je ne comprens pas tout lol...J'ai un peu changé tout ça comme je le sentais

    En fait, j'essaye de faire ça :
    Lorsque l'utilisateur appuie sur la touche de tire, un nouveau Thread d'affichage est créé.Ce thread affiche les différentes positions de ce missile.

    Et je n'y arrive pas

    Voilà, merci pour votre aide!

  17. #17
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Ouh la la, créer un thread juste pour lancer un missile....

    Il ne faut pas que la personne soit un malade de la gâchette sinon ton programme va pas aimer !

    Essaye de concevoir autrement ton programme !
    Les threads ce n'est pas le plus simple et il n'y en a pas besoin pour ton cas.

    Utilise un timer !

    Dans le timer tu maintiens une liste de missile, avec coordonnées, vecteur de direction etc....
    A chaque fois que le timer est lancé tu fais un petit calcul:
    temps écoulé depuis le dernier timer lancé, vitesse par m/s ou autre et tu calcul suivant le vecteur de direction l'avancé du missile à répéter pour chaque missile !

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    euh...
    Bah c'est quoi un timer Ti-R?
    Et je ne sais pas trop si ça peut marcher...
    Pasque mon programme principal est une boucle qui atten que l'utilisateur appuie sur une touche pour savoir ou son vaisseau doit etre déplacé...
    Il doit y avoir d'autre solution, mais he ne les connais pas alors...
    En fait je fait un cin>> de la touche sur laquel l'utilisateur appuie.
    Pour une certaine touche, son vaisseau monte, une autre il descend, etc...
    Alors sans les threads, quan il appuie sur la touche de tire, il lance bien un missile, mai s'il ne presse aucune touche pour déplacer sont vaisseau, le missile n'avance plus non plus, et ça c'est balot

    Voilà, voilà ^^

    Si quelqu'un connai d'autre solution (avec la syntaxe et tout pasque je suis sur de ne pas connaitre ), merci de partager votre grand savoir ^^

  19. #19
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    hum.... bizarre ton programme
    Il faut que tu nous en dises + !

    Car attendre l'entrée user en mode bloquant.... il y a d'autre solution surtout sous Visual C++

    Quel sont tes contraintes, utilises-tu une bibliothèque graphique etc...

    Ton programme ressemble à un programme DOS, mais peux-tu le passer via un CDialog qui pourrait être un moyen simple d'avoir un timer, et récupérer les touches clavier...

    Voila need ++ pour informer ++

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    Bah, pour te répondre Ti-R, c'est une application win 32, donc ouui du DOS, avec une fenêtre graphique, je ne sais faire que ça (je débute quoi ^^)
    La seul commande que je connais pour savoir si l'utilisateur appui sur une touche, c'est cin>> , je me doute bien qu'il en existe d'autre, mais je ne les connais pas.
    Donc le programme ne tourne pas, il attend qu'on prese un touche lol

Discussions similaires

  1. Aide sur les Thread
    Par walid kh dans le forum VB.NET
    Réponses: 8
    Dernier message: 06/04/2010, 12h18
  2. besoin d'aide sur les thread
    Par demonofshadow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 14/01/2010, 15h07
  3. aide sur les thread
    Par aurel_le_ouf dans le forum C#
    Réponses: 1
    Dernier message: 26/03/2008, 16h16
  4. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19
  5. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13

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