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 :

Problème de thread GUI


Sujet :

Multithreading

  1. #1
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut Problème de thread GUI
    Bonjour,

    J'ai une situation un peu complexe de je vais tenter de simplifié:

    Dans ma fonction main(...) j'execute mon application GUI Qt. Celle-ci lance un Qthread de calcul. Dans mon calcul une "Segmentation fault" arrive.
    Comme dans mon main j'ai déclaré la fonction handle_signal (comme est ecrit dessous) de maniére à intercepter le signal "seg_fault".

    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
     
     
    void handle_signal(int param)
    {
      QMessageBox::critical(NULL,"System error","seg fault");
      exit(0);
    }
     
    int main(int argc, char *argv[])
    {
      Application app(argc, argv);
     
      signal (SIGSEGV,handle_signal);
      ...
      ..
      .
    Evidemment tout ca fonctionne bien jusqu'au QMessage qui fait tout planter parce que c'est du graphique en dehors du Thread GUI.

    Moi j'aimerai bien afficher cette boite de message mais je ne sais pas trop comment.

    Merci de vos suggestions

  2. #2
    Membre éprouvé
    Avatar de GreatTux
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 77
    Par défaut
    Il faut faire appel à la QMessageBox dans ton thread GUI. Pour cela tu peux utiliser les signaux/slots entres ton thread GUI et ton thread de calcul.

  3. #3
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Oui, mais une fois dans la fonction "handle_signal" je ne suis plus dans mon thread de calcul, non ?

  4. #4
    Membre éprouvé
    Avatar de GreatTux
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 77
    Par défaut
    Je pense que le handler de ton signal est appelé dans le thread où intervient le signal donc ton thread de calcul.

  5. #5
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Oui c'est ce que je viens de voir en plottant les valeurs des threads.
    Maintenant ma question est comment connecter mon thread de calcul avec la fonction connect(...) sachant que mon thread de calcul est appeler par un QConcurrent::run(my_func_calcul...). Il n'y a pas de pointeur 'this' accessible dans une telle fonction.
    J'ai fais la connection depuis le GUI avec "connect(this,SLOT...,this, SIGNAL...) et ca semble fonctionner !
    Je trouve ca étrange

  6. #6
    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 uriotcea Voir le message
    Maintenant ma question est comment connecter mon thread de calcul avec la fonction connect(...) sachant que mon thread de calcul est appeler par un QConcurrent::run(my_func_calcul...). Il n'y a pas de pointeur 'this' accessible dans une telle fonction.
    C'est à dire?

    Tu utilise QConcurrent::run sur un QObject??

  7. #7
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Non sur une fonction C non Object

  8. #8
    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
    j'ai pas compris ta question...
    Ta fonction C doit appeler ton thread de calcul avec des signal/slots?

  9. #9
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    C'est moi qui ne suit plus là.

    QConcurrent::run(func_cal..) lance bien la func_cal dans un thread différent du GUI ?
    Enfin, moi c'est ce que j'observe.

  10. #10
    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 uriotcea Voir le message
    QConcurrent::run(func_cal..) lance bien la func_cal dans un thread différent du GUI ?
    Oui c'est le but.

    Donc j'ai pas compris ton problème.

  11. #11
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Citation Envoyé par yan Voir le message
    Ta fonction C doit appeler ton thread de calcul avec des signal/slots?
    Oui d'accord c'est le but, moi j'essayais de comprendre ta question !

    Ma question est la suivante comment ecrire la focntion connect entre mon GUI et ma fonction C

  12. #12
    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 uriotcea Voir le message
    moi j'essayais de comprendre ta question !


    Citation Envoyé par uriotcea Voir le message
    Ma question est la suivante comment ecrire la focntion connect entre mon GUI et ma fonction C
    En principe, si tu as besoin de signal/slot passe par un QThread.
    Les runnable, threadpool, concurrent,... ne sont pas adapté à l'utilisation de QObject.
    C'est en générale des traitements court.

    Pourquoi ne pas utiliser de QThread?

    sinon il te faut un QOBject pour emettre les signaux. Si tu n'as pas de paramètre, QTimer::singleshot devrait passer aussi.

  13. #13
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Oui je comprend.
    Malgré tout j'ai essayé en declarant la connection dans mon Thread GUI de la facon suivant : "connect(this,SLOT(func1),this, SIGNAL(fun2))"

    Et ca semble fonctionner, ce trouve cela étrange, enfin là je reprend la discution initial un peu au début

  14. #14
    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 uriotcea Voir le message
    Oui je comprend.
    Malgré tout j'ai essayé en declarant la connection dans mon Thread GUI de la facon suivant : "connect(this,SLOT(func1),this, SIGNAL(fun2))"

    Et ca semble fonctionner, ce trouve cela étrange, enfin là je reprend la discution initial un peu au début
    Si je comprend bien,
    * tu as un QThread qui as un signal func1 et slot func2.
    * les deux sont connectés
    * func2 fait un traitement IHM.

    La question est pourquoi ça marche. C'est cela?

  15. #15
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Désolé je ne suis pas clair

    func1 & 2 sont déclaré dans le Thread principale ce que j'appel le Thread_GUI

    De ma fonction C j'appel une fonction de mon thread principale (j'ai un pointeur global) qui emet le signal func1.

  16. #16
    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 uriotcea Voir le message
    Désolé je ne suis pas clair

    func1 & 2 sont déclaré dans le Thread principale ce que j'appel le Thread_GUI

    De ma fonction C j'appel une fonction de mon thread principale (j'ai un pointeur global) qui emet le signal func1.
    Pourquoi ça marche :
    1- les signaux sont thread safe et peuvent être appeler de n'importe ou.
    2- En mode auto (par défaut), un slot s'exécute toujours dans le thread auquel appartient le QObject (pour toi le thread_GUI).

    Donc, quand tu appel ta fonction depuis le thread, il va appeler le signal. Comme c'est thread-safe, jusqu'ici aucun problème et le signal est emit par le thread.

    Le slot connecté appartiens au thread_GUI. Il ne sera donc pas appeler directement par l'émission du signal. Un event est ajouter à l'eventloop de thread_GUI qui va exécuter le slot. Le slot s'éxécute dans le thread_GUI => merci Qt

    Ce qui est bizarre dans ton archi c'est qu'un thread appel des fonctions d'un classe d'un autre thread.. Tu devrais lire ceci :
    http://www.developpez.net/forums/d94...-movetothread/

  17. #17
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Oui c'est plutot bizare, mais la fonction en question en fait qu'emettre un signal (thread safe disais-tu)
    De plus ne je peux utiliser movetoThread, ma fonction n'heritant pas de QOBject

Discussions similaires

  1. Problème de thread : Plus de ressources système
    Par OliverSleep dans le forum C++Builder
    Réponses: 17
    Dernier message: 07/02/2006, 15h35
  2. [VB.NET] Problème de Thread
    Par Sadneth dans le forum ASP.NET
    Réponses: 26
    Dernier message: 31/01/2006, 10h12
  3. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 16h57
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

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