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

Qt Discussion :

Rapport "Ne pas envoyer"


Sujet :

Qt

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut Rapport "Ne pas envoyer"
    Bonjour =)
    Voilà je suis en ce moment sur un projet de "mini-jeu" online combinant Qt et SFML. Depuis peu mon projet lance un rapport d'erreur "ne pas envoyer" lors de son lancement sur d'autres pc, mais pas sur le miens.
    Alors j'aimerais vous demander s'il n'existerais pas des sources principales de ce rapport d'erreur ? Si oui lesquelles ? =)

    J'aimerais également préciser que lors de la compilation de mon projet, j'ai deux "warnings" récurants :
    "extra tokens at end of #ifndef directive"
    "ISO C requires whitespace after the macro name"

    Peuvent-ils être source d'erreurs ?

    Merci d'avance

    ps : Mon jeu commençant à être imposant, je ne peux pas décemment fournir de codes. Par contre les deux warnings proviennent d'un même fichier que je peux donner si quelqu'un le souhaite. =)

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Tu es sous quel plate forme ? Tu compiles avec quoi ?
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Je suis sous Windows XP mais je sais qu'une erreur similaire survient également sous Linux. Et je compile avec minGW. =)

  4. #4
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Il y a uniquement au moment du deploiement que tu as un problème ou sur la machine sur laquelle tu compiles quand tu lances le code cela plante ?
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    En fait, le projet compile parfaitement chez moi, à l'exception des deux warnings, et s'exécutent de même.
    Seulement c'est justement sur les machines sur lesquelles je n'ai pas compilé que le rapport d'erreur survient.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    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 122
    Billets dans le blog
    148
    Par défaut
    Le rapport à ne pas envoyer, ça doit être la notification de l'erreur de segmentation sous windows.
    Donc se serai une erreur de segmentation, mais bien sur comme cela ne se produit pas sur la machine de développement ça va être un peu dur à débugger.
    Si c'est ua début, c'est peut être que tu as oublié de copier les ressources ( images ou autres ) et donc, qu'en on ne prévoit pas ce cas, ça plante lamentablement.

    Si tu as fais des sorties de debugguage sur le cout , lance ton programme en passant par cmd.
    Sinon, fais quelque cout pour t'aider à trouver le bug

    Pour le warning, il semble que tu es fais une petite faute sur le ifndef, normalement, le compilateur te donne la ligne.
    Il se peut que c'est parce que tu as un #endif en trop.
    Tu peux toujours poster le fichier pour que l'on regarde, mais je pense que tu trouvera vite
    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.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    peut tu donner l"erreur exacte qui t'es affiché?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Merci bien pour vos réponses =)
    En fait, j'ai résolu le warning en enlevant le tirer haut dans le nom du ifndef --"
    Sinon, je ne pense pas que ce soit un problème de ressource, elles y sont toutes.

    Sur certains PC malgré tout, on peut continuer à naviguer sur le programme malgré le rapport d'erreur. Et je m'aperçois que le problème se situe à la réception de données qui viennent du serveur.
    Pourtant le code de réception est court et claire . .

    En fait, je voudrais surtout savoir s'il faut que la lecture passe par l'erreur pour que le rapport survienne ?

    Sinon c'est l'erreur classique : "Game.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru".

    Merci d'avance

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Fullmetal82 Voir le message
    Sinon c'est l'erreur classique : "Game.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru".
    y as pas un code d'erreur?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Non aucun =/

    En fait il semblerait que la lecture, sur les autres pc, n'entre pas dans le thread de réception de données.
    Est-ce qu'un thread peut être source de telle erreur ?

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Fullmetal82 Voir le message
    Non aucun =/

    En fait il semblerait que la lecture, sur les autres pc, n'entre pas dans le thread de réception de données.
    Est-ce qu'un thread peut être source de telle erreur ?
    Peut y avoir plein de raison à ce plantage.
    Il me semblais que ce mesage fournissait un code d'erreur 0x000005 ou autre.
    Essaie de faire une version avec un console (ajout de CONFIG += console) et de voir s'il y as des choses écrite.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    ah en effet la console est fort utile =)
    Voilà ce qu'elle me marque :
    "QThread : Destroyed while thread is still running".

    Ce qui est ma foi fort claire ^^
    Mais je ne vois pas du tout pourquoi le thread de réception se détruit. .

    Voilà donc le code de la fonction thread :

    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
    47
    48
    49
    50
    51
    void NetworkEngine::recevoirPacket()
    {
     
    //Création du packet dans lequel on reçoit
        sf::Packet Packet;
    	Packet.Clear();
     
     
    ////////////////////////////////////////// Boucle Infinie //////////////////////////////////////////////////////////////////
    while(true)
    	{
     
    		//Si on n'a pas réussi à recevoir le Packet
        if (socketClient.Receive(Packet) != sf::Socket::Done) //Attente de la réception d'une donnée venant du serveur
    {}
    	//Si on a réussi à recevoir le Packet
    else 
    		{
     
     
    cochonTest.vie = 0, cochonTest.nomCochon = "", cochonTest.position.x = 0, cochonTest.position.y = 0, cochonTest.nbFrameCurrent = 0, cochonTest.angle = 0, cochonTest.nbVictoire = 0, cochonTest.nbDefaite = 0;
     
     
    //////////////////////////On récupère le Packet dans des variables /////////////////////////////////////
    Packet >> typePacket >> isConnect >> isCreate >> cochonTest.vie >> cochonTest.nomCochon >> cochonTest.position.x
    >> cochonTest.position.y >> cochonTest.nbFrameCurrent >> cochonTest.angle >> cochonTest.nbVictoire >> cochonTest.nbDefaite;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
     
     
    if (typePacket == 1)
    recevoirPacket1();
     
    if (typePacket == 2)
    recevoirPacket2();
     
    if (typePacket == 3)
    recevoirPacket3();
     
    if (typePacket == 4)
    recevoirPacket4();
     
    Packet.Clear();
     
    		}
     
    //Si le packet a été correctement reçu et récupérer, on le nettoie et on initialise les variables de récupération.
     
     
    	}//Fin de la boucle infinie ///////////////////////////////////////////
     
    }

    Et le code du la classe du thread :

    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
    #ifndef RECEVOIRTHREAD_H_INCLUDED
    #define RECEVOIRTHREAD_H_INCLUDED
     
    #include <QThread>
    #include "Network-Engine.h"
     
    class RecevoirThread : public QThread
    {
        public:
     
     
    void attach(NetworkEngine* client)
    {
    c = client;
    }
     
    void run()
        {
     
    c->recevoirPacket();
     
        }
     
    private :
    NetworkEngine* c;
     
    };
     
     
     
    #endif // RECEVOIRTHREAD_H_INCLUDED

    Si quelqu'un voit quelle pourrait être la cause de cette suppression.

    Merci d'avance

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    NetworkEngine est un QObject?
    Il utilise des objets QObject?
    Une fois donné à la thread, cette objet peut être manipulé par quelque'un d'autre?
    C'est quoi recevoirPacket1();,recevoirPacket2(); et recevoirPacket3();
    Regarde ces quelque QR sur les thread http://qt.developpez.com/faq/?page=Thread
    Tu y trouvera peut être une aide

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Merci =)
    Je viens de faire un tours sur le lien que tu m'as donné et ça ne m'a pas clairement éclairé sur mon problème mais il y a quand même matière à réfléchir =) Comme : "Les QObjects appartiennent au thread qui les créé. Il faut donc créer/supprimer les QObjects utilisés par le thread dans la méthode run()."

    Puisqu'en effet NetworkEngine est un QObject mais par contre, il n'utilise pas de QObject.
    Donc il faudrait que je déclare mon NetworkEngine dans la fonction run() ?

    Le NetworkEngine passait au QThread est utilisé par tout le programme. Mais sa fonction recevoirPacket() n'est utilisé que par le thread ainsi que toutes les variables que contient cette fonction.

    Je rajoute les codes des fonctions recevoirPacket. . . :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    void NetworkEngine::recevoirPacket1()
    {
        cochonReconnu = false; //On spécifie au programme que le cochon duquel vient le packet n'a pas encore été reconnu.
     
    //On compare le nom des joueurs existants au nom du joueur reçu
    	for (sf::Int32 i = 0; i < nbJoueurs;)
    	{
    		if (cochonTraiter[i].nomCochon == cochonTest.nomCochon) //Si le cochon est reconnue parmis les joueurs en cours
    		{
     
     
                cochonTraiter[i].position.x = cochonTest.position.x;
    			cochonTraiter[i].position.y = cochonTest.position.y;
    			cochonTraiter[i].nbFrameCurrent = cochonTest.nbFrameCurrent;
    			cochonTraiter[i].angle = cochonTest.angle;
    			cochonTraiter[i].vie = cochonTest.vie;
    			cochonTraiter[i].nbVictoire = cochonTest.nbVictoire;
    			cochonTraiter[i].nbDefaite = cochonTest.nbDefaite;
    			cochonReconnu = true;
    		}
    			i++;
    	}//Fin du traitement du message reçu
     
    //Si le Packet n'est assigné à aucun cochon existant, on crée un nouveau cochon.
    	if (cochonReconnu == false)
    	{
     
    QString pseudo(cochonTest.nomCochon.c_str());
    nouvelleConnection(pseudo, cochonTest.nbVictoire, cochonTest.nbDefaite);
     
     
    		//Récupération des données reçus dans le vrai cochon
    		cochonTraiter[nbJoueurs].nomCochon = cochonTest.nomCochon;
    		cochonTraiter[nbJoueurs].position.x = cochonTest.position.x;
    		cochonTraiter[nbJoueurs].position.y = cochonTest.position.y;
    		cochonTraiter[nbJoueurs].nbFrameCurrent = cochonTest.nbFrameCurrent;
    	    cochonTraiter[nbJoueurs].angle = cochonTest.angle;
            cochonTraiter[nbJoueurs].vie = cochonTest.vie;
            cochonTraiter[nbJoueurs].nbVictoire = cochonTest.nbVictoire;
            cochonTraiter[nbJoueurs].nbDefaite = cochonTest.nbDefaite;
     
    		//Création du cochon détaillée
    		cochonTraiter[nbJoueurs].SetCenter(210, 350);
     
     
    		//Incrémentation du nombre de joueurs
    		nbJoueurs++;
    	}
     
     
    }
     
    void NetworkEngine::recevoirPacket2()
    {
     
    if (isConnect == true)
    {
        // Récupération du Cochon.
     
    myCochon.nomCochon = cochonTest.nomCochon;
    connected = true;
    }
     
     
     
    }
     
    void NetworkEngine::recevoirPacket3()
    {
        if (isCreate == true)
        {
    created = true;
        }
     
    }
     
    void NetworkEngine::recevoirPacket4()
    {
    }



    Je me demandais aussi si cette erreur ne venait pas du fait que je ne prévois rien pour arrêter le thread lors de la fin de l'application ? Ce qui est d'ailleurs impossible vu que j'entre dans une boucle infinie.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Tu te pause de bonne questions
    En premier, vue que tu utilise des socket bloquante (de sfml?),tu devrais déplacer le code de recevoirPacket() dans le thread.
    Après, il te faut choisir la méthode pour partager tes données reçus :
    * protection QMutex ou QReadWriteLock
    * signal/slot
    * ...
    Je te conseil de regarder les exemples founies par Qt :
    http://qt.developpez.com/doc/4.5/thr...uedcustomtype/
    http://qt.developpez.com/doc/4.5/threads-mandelbrot/

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Merci pour ta réponse =)

    hum si je déplace le code dans le thread, il faudrait que je mette cochonTraiter[] en public non ? Ou alors faire deux class amies. .

    D'ailleurs, ma seule variable partagée est cochonTraiter[], et dans le thread principal, je me contente de la lire et non de la modifier, alors ai-je besoin de la protéger ?

    Merci d'avance

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Fullmetal82 Voir le message
    D'ailleurs, ma seule variable partagée est cochonTraiter[], et dans le thread principal, je me contente de la lire et non de la modifier, alors ai-je besoin de la protéger ?
    Comme ta thread modifie cochonTraiter, oui.
    D'ailleurs tes plantages viens peut être (surement une partie) de là.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    En fait, en mettant en paramètre le contenu de recevoirPacket(), je m'aperçois que l'erreur que j'aie vient de la boucle infinie. Et c'est de même pour une boucle for trop longue. . - -"

    Quelqu'un saurait pourquoi la boucle infinie pose problème ? =/

  19. #19
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Fullmetal82 Voir le message
    Quelqu'un saurait pourquoi la boucle infinie pose problème ? =/
    Ce n'est pasla boucle qui pose problème. Ce son les accès concurrent à une données.
    Sans protection, un thread peut se retrouvé avec des données fausse. Par exemple avec une string.
    Thread A utilise la string. Le traitement parcoure la mémoire alloué
    Thread B au même moment modifie la string qui génère une réallocation de la mémoire de la string

    => Thread A fait un traitement sur de la mémoire invalide => PLANTAGE

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    hum pourtant l'erreur "QThread : Destroyed while thread is still running" ne survient que quand je rajoute la boucle infinie. Alors ce n'est pas ça qui est à l'origine du plantage ?

    hum excusez-moi mais si vous pouviez me donner juste une petite précision =)
    Pour protéger une variable, il suffit de l'entourer des fonctions lock() et unlock() d'un mutex, autant dans le thread secondaire que dans le thread principale ?

    Merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [RegEx] Pas de quote, sauf si échappée
    Par xxkirastarothxx dans le forum Langage
    Réponses: 0
    Dernier message: 20/05/2014, 15h41
  2. [FORM] ne pas envoyer tout lors d'un submit
    Par pmartin8 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 08/12/2005, 20h50

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