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 :

[Thread] Signal/Slot et Thread


Sujet :

Multithreading

  1. #1
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut [Thread] Signal/Slot et Thread
    C'est possible dans une GUI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    	connect(&thread, SIGNAL(emitSignal()), this, SLOT(this->method()));
    Mais ca ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	connect(this->interface.sendButton, SIGNAL(clicked()), this, SLOT(thread.method()));
    ou est ce qu on est obligé de passer par une méthode contenant thread.method() ?

  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
    Salut.
    pour commencer faudrait que tu revoie les connect.
    Tu peut regarder la FAQ elle viens d'être mise a jour et la doc :
    http://qt.developpez.com/doc/latest/...sandslots.html

    Ensuite pour le connect entre thread tu peut regarder :
    http://www.developpez.net/forums/sho...d.php?t=484613
    http://www.developpez.net/forums/sho...2&postcount=23

  3. #3
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Merci, je vais regarder, pour le moment je mets les méthodes du thread dans les slots de mon appli. Ca fonctionne. J'ai lu le doc Trolltech récemment. Hormi une particularité des threads, je ne vois pas pourquoi on ne pourrait pas mettre en slot un méthode d'une instance de QThread (un thread, quoi), et l'activer avec un signal du main thread. D'autant plus que l'inverse est possible, comme dans l'exemple de mandelbrotalors...

  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
    Salut
    Citation Envoyé par ttone Voir le message
    Merci, je vais regarder, pour le moment je mets les méthodes du thread dans les slots de mon appli. Ca fonctionne. J'ai lu le doc Trolltech récemment. Hormi une particularité des threads, je ne vois pas pourquoi on ne pourrait pas mettre en slot un méthode d'une instance de QThread (un thread, quoi), et l'activer avec un signal du main thread
    attention un QThread et les objet créé dans son créateur appartiennent au thread qu'il la créé!!!
    Seul tout les objets qui sont créént dans la méthode run appartiennent au nouveau thread
    J'ai mis un exemple ici :
    http://www.developpez.net/forums/sho...5&postcount=15

    la différence est le mode de connection. En gros, l'appel du slot d'objet appartenant au même thread que le signal sera comme un appel direct.

    l'appel du slot d'objet appartenant à un thread différent que le signal, l'appel sera sérialisé dans l'eventloop de la thread pour être traité plus tard.

    Un autre point est qu'un emit est thread safe

  5. #5
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par ttone Voir le message
    Hormi une particularité des threads, je ne vois pas pourquoi on ne pourrait pas mettre en slot un méthode d'une instance de QThread (un thread, quoi)
    On peut, c'est juste que ce n'est pas ce que tu demandes. Tu connecte le signal a un slot de "this" au lieu d'un slot de ton thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(this->interface.sendButton, SIGNAL(clicked()), thread, SLOT(method()));

  6. #6
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    toutes mes confuses, ma question est en fait, peut on écrire ca ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	connect(this->interface.sendButton, SIGNAL(clicked()), thread, SLOT(thread.method()));
    c'est thread safe, donc ok.
    par crainte, je passais par des méthodes ...qui contenait

  7. #7
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Seul tout les objets qui sont créént dans la méthode run appartiennent au nouveau thread
    A propos, je n'ai quasiment rien dans ma méthode run, sinon quelques initialisations secondaires, qui passent après le constructeur. Toutes mes méthodes sont "en plus", et sont appelé par les événements GUI (keyPressEvent, signal sur éléments graphiques, etc.). Est ce normal ?
    la différence est le mode de connection. En gros, l'appel du slot d'objet appartenant au même thread que le signal sera comme un appel direct.

    l'appel du slot d'objet appartenant à un thread différent que le signal, l'appel sera sérialisé dans l'eventloop de la thread pour être traité plus tard.
    est ce que tu as un lien particulièrement intéressant pour ca ? Ca m'intéresse pas mal...

    Un autre point est qu'un emit est thread safe
    Vive Qt, c'est pratique à souhait

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Non, comme le disent Aurélien et Mongaulois, c'est possible. Les signaux/slots de Qt permettent justement de connecter des signaux à des slots qui sont dans des threads différents. Il y a une page de la doc officielle qui y est dédiée si je ne m'abuse.

  9. #9
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Ok, ==>Résolu.

    Une question de newbie absolue j'imagine, comment utiliser un QThread pour gérer un compteur ? Je travaille sur un player video, je voudrais avoir dans mon thread un emit permanent vers mon mainThread/GUI, pour afficher la progression de la lecture. Un indice ?

    Merci pour votre aide

  10. #10
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    A mon avis, il faut connecter un signal personnalisé que tu mettrais par exemple dans ta classe dérivant de QThread à un slot dans ton IHM permettant de mettre à jour l'avancement de la lecture. Un signal et le slot auquel il est connecté devant avoir la même signature, je te conseille de passer par exemple un int, qui serait le nombre de millisecondes par exemple... ou de secondes.

  11. #11
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    A mon avis, il faut connecter un signal personnalisé que tu mettrais par exemple dans ta classe dérivant de QThread à un slot dans ton IHM permettant de mettre à jour l'avancement de la lecture. Un signal et le slot auquel il est connecté devant avoir la même signature, je te conseille de passer par exemple un int, qui serait le nombre de millisecondes par exemple... ou de secondes.
    Tout à fait je pars dans cette direction, mais le problème que je mepose, c'est comment émettre le signal continuement ou par pas d'une centiseconde par exemple ?

    La mention de MontGaulois de l'eventLoop m'a fait penser que c'est peut être par là qu'il faut que je cherche.

  12. #12
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Pour émettre un signal comme tu le souhaites, il faut faire une boucle dans laquelle tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    emit tonSignal(ton_int_representant_lavancement);
    puis tu attends X millisecondes.
    Cette boucle sera exécutée et à chaque fois demandera de mettre à jour ton composant graphique dans lequel tu inscris l'avancement de la lecture.

  13. #13
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Ce qui m'étonne dans tout ca, en bien d'ailleurs, c'est qu'avant la lecture média bloquait mon mainThread, ok, maintenant elle se fait en parallèle et je peux en plus mettre des set/get dans tous les sens sur ce média, tout passe.

  14. #14
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Ton dernier problème a été résolu ?

  15. #15
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Non, je mets en place un thread propre au comptage.
    D'ailleurs on est autorisé à instancier un thread dans un thread ?
    Quelle est la meilleure solution en terme de stabilité ?

  16. #16
    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 ttone Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	connect(this->interface.sendButton, SIGNAL(clicked()), thread, SLOT(thread.method()));
    c'est thread safe, donc ok.
    pas dans ce sens car this et thread sont la même thread. Donc le connect est direct
    par contre un emit dans la fonction run est threadsafe.
    regarde le lien que je t'ai donnée. y as aussi un exemple pour comprendre.
    Tu as aussi cette partie de la doc
    http://qt.developpez.com/doc/latest/...s-and-qobjects

    pour ce que tu veut faire, un QTimer ne correspond pas??

  17. #17
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    pour ce que tu veut faire, un QTimer ne correspond pas??
    Je me suis posé la question, mais je ne pense pas que ca aille.

    En fait voilà, j'ai mon mainThread et mon mediaThread, ... pour l'instant je lance mon mediaThread qui est soumis à plusieurs signaux (play, pause, stop, volume, zoom, etc...) pendant la lecture du media.
    Et qui émet (emit) des infos de nature a modifier les propriétés de la GUI/

    C'est sur 2 propriétés en particulier que je cherche à faire un "timer", d'abord pour avoir un compteur, mais QTimer n'ira pas a toute première vue, car je me déplace dans mon fichier (j'avance, je reviens au début, etc) donc je pensais faire un getPosition sur la tête de lecture en permanence et afficher ca...
    La 2eme propriétés est que j'utilise un slider en IN/OUT, je m'en sers pour me positionner dans le media, je voudrais aussi qu'il bouge pour informer de l'avancée de la lecture, ...

    ces 2 propriétés en perpétuel changement, ne peuvent pas se faire dans mon mediaThread car elles nécessite une boucle et le bloquerai, j'ai donc pour le moment, ajouté un thread fils à mediaThread qui se lance à l'initialisation de mediaThread :

    mainThread

    mediaThread

    timerThread

    et à chaque pas de la boucle tout remonte, un emit de timerThread tamponne un signal de mediaThread, qui arrive sur un slot de mainThread et fait bouger le slider...

  18. #18
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    enfin en théorie, car le debug a l'air de détester mes threads en série...
    you should never pass the QThread object (this) as the parent of an object created in the thread (since the QThread object itself was created in another thread).

  19. #19
    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 ttone Voir le message
    enfin en théorie, car le debug a l'air de détester mes threads en série...
    ceci n'est pas un problème. En faite, c'est pas évident de comprendre comment marche un QThread.Je vais essayer d'expliquer. N'hésite pas a poser des questions.

    Un QThread est simplement un objet qui va lancer une thread. Le code que va lancer la QThread est dans run.
    Donc tout ce qui est créé et exécuter dans run appartiens au thread, pas le reste.
    [QUOTE]you should never pass the QThread object (this) as the parent of an object created in the thread [/QUOTE]
    Ca veut simplement dire de ne pas mettre comme parent à un objet, un objet d'une autre thread. Or QThread n'appartient pas au thread quel va lancer. Pas ce qui sera créé dans le run

    C'est ca qui est difficile à comprendre.
    En gros tout ce que doit utiliser ta thread doit être créé dans run.
    Si tu veut utiliser des slot et des signal avec une QThread, le plus propre est de déporter ton code dans un QObject qui sera instancié dans le run et lancer l'eventloop de la thread.
    Comme tu peut connect des signaux entre eux, tu peut te servir de la QThread pour interfacer ta thread. Ainsi un signal emit par la gui sera connecté directement avec un signal du Qthread qui sera connecté indirectement au slot du QObject de la thread.

    Un signal emit par le QObject sera connecté indirectement à un signal du QThread qui sera connecté directement au slot de la GUI

    connecté directement : les objet appartiennent au même thread, cette connection équivaux à un appel directe de la fonction

    connecté indirectement : les objets appartiennent à deux thread différentes, les paramètres sont copiés et envoyés dans l'eventloop du slot pour être exécute dés que possible.

  20. #20
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Merci,

    sauf que bizarrement, en ayant pas saisi, j'ai quasiment rien mis dans run, et pourtant ca ne freeze pas...

    Sinon une classe dérivant de QThread, ne serait qu'une classe pouvant contenir un run, lui même start-able depuis la classe qui l'instancie ?...

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

Discussions similaires

  1. Thread - Signal : Stop thread sur signal
    Par DaSiX dans le forum Général Python
    Réponses: 5
    Dernier message: 30/12/2014, 16h58
  2. Réponses: 8
    Dernier message: 22/05/2010, 12h50
  3. [TOMCAT] [THREAD] Ajout d'un thread à Tomcat
    Par olivangel dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 12/08/2004, 12h55
  4. [Thread] comment arreter un thread qui execute une methode b
    Par Cyber@l dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/08/2004, 11h51

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