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

Multithreading Discussion :

Crash à la fin de run() à cause d'un signal


Sujet :

Multithreading

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut Crash à la fin de run() à cause d'un signal
    BOnjour à toutes et à tous !

    J'utilise la classe QThread pour réaliser un traitement dans mon application.
    Dans la fonction run(), je réaliser une boucle, et à chaque tour, j'envoie un signal pour envoyer mon résultat dans mon application principale où a été créé mon thread (thread créé dans une fonction uniquement) lors du clic sur un bouton (fonction UTiliserMonThread()).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void MyThread::run()
    {
             while(maCondition)
             //traitement
             emit(SignalResultat(mesResultats));
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void AppliPrincipal::UTiliserMonThread()
    {
             MyThread thread = new MyThread(fileName);
             connect(thread , SIGNAL(SignalResultat(double**)), this, SIGNAL(afficherResultats(double**)));
             thread ->start();
    }
    Tout se déroule normalement, le résultat est correctement afficher les X fois que durent la boule, mais une fois finie, l'appli plante.
    si je retire le "emit" de "run()", plus de plantage !

    Merci d'avance !

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par olivier21c Voir le message
    connect(thread , SIGNAL(SignalResultat(double**)), this, SIGNAL(afficherResultats(double**)));
    http://qt.developpez.com/faq/?page=T...connect-thread

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut
    j'ai déjà le constructeur par défaut et celui par copie.
    si je crée le constructeur par copie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MyThread::MyThread(const MyThread&_other)
    	:	QThread(_other),
    		fileName(_other.fileName)
    {
    }
    il y a erreur à la compilation sur a ligne "QThread(_other),"

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut

    as tu regardé le lien que je t'ai mis???

    QThread est un QObject. Il n'est don pas copiable.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut
    alors en fait.... pour mon application, je dois tester une partie sur une machine virtuelle XP (je suis sous seven, et j'utilise un périphérique où il n'y a pas de drivers sous seven ).

    la partie où le bug survient peut par contre être utilisée sous seven aussi.
    sous la machine virduelle xp -> pas de bug
    sous seven -> bug

    je pense avoir trouvé d'où vient le problème. la machine virtuelle est plus lente que seven, et si j'ajoute à la fin de mon run() un sleep (qui retarde la fin du thread et donc sa destruction, si j'ai bien compris), plus de plantage.

    je suppose donc que la valeur que j'envoie dans mon signal (double**) est détruite avant que le slot de réception n'est pu le récupérer et copier les données, ce qui entraîne un bug sous seven...

    est ce que qqun pourrait me confirmer mon exlpication, et le cas échéant me proposer une solution "propre"

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par olivier21c Voir le message
    je suppose donc que la valeur que j'envoie dans mon signal (double**) est détruite avant que le slot de réception n'est pu le récupérer et copier les données, ce qui entraîne un bug sous seven...
    c'est exactement cela
    A noté que la diffèrence entre seven et xp est plutôt un "tombé en marche" sous xp et plantage sous seven.
    Dans la faq (cf lien) c'est écrit :
    Ne jamais utiliser un pointeur ou une "référence non const" dans les signatures des signaux/slots. Rien ne permet de certifier que la mémoire sera encore valide lors de l'exécution du slot ;
    C'est quoi ton double ** ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut
    c'est tableau N x N qui contient mes résultats.
    j'avais au préalable utiliser un vector<vector<double>> et aussi un vector<double>, mais les temps d'exécution grimpaient de trop (je bosse sur une appli temps réelle)

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par olivier21c Voir le message
    c'est tableau N x N qui contient mes résultats.
    j'avais au préalable utiliser un vector<vector<double>> et aussi un vector<double>, mais les temps d'exécution grimpaient de trop (je bosse sur une appli temps réelle)
    Essaie un QVector, il exploite le COW
    http://qt.developpez.com/faq/?page=g...optimise-copie

    Ou avec un QSharedPointer.

    Sinon tu peux aussi essayer une connection BlockingQueuedConnection http://qt.developpez.com/doc/latest/...ctiontype-enum.

    Sinon il te faudra faire des mutex & co.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut
    d'ac, merci pour tes réponses rapides !
    je regarde tout ça et j'indiquerai la solution retenue

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par olivier21c Voir le message
    d'ac, merci pour tes réponses rapides !
    je regarde tout ça et j'indiquerai la solution retenue
    Ha oui et ne pas oublié d'enregistrer le type que va envoyer par le signal avec
    qRegisterMetaType
    http://qt.developpez.com/doc/latest/...gistermetatype

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 91
    Points : 50
    Points
    50
    Par défaut
    j'ai remplacer mon double** par un un QVector< QVector<double> >, dans le signal envoyé en rérérence constante.

    il me suffit d'ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qRegisterMetaType< QVector < QVector<double> > >("QVector < QVector<double> >");
    et c'est tout bon ! (je l'avais vu dans ton précédent lien, mais merci tout de même)

    merci yan pour ta précieuse aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fermer excel cause Crash Excel
    Par Benjijmin dans le forum Excel
    Réponses: 2
    Dernier message: 19/01/2009, 21h12
  2. SWT : plantage lors du "Run" à cause d'une mauvaise version
    Par monsieurouxx dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 01/09/2007, 17h10
  3. Réponses: 0
    Dernier message: 27/08/2007, 13h16
  4. Crash à cause d'un pointeur, inexpliqué :/
    Par Bakura dans le forum C++
    Réponses: 0
    Dernier message: 31/07/2007, 23h21
  5. Réponses: 18
    Dernier message: 19/06/2006, 14h48

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