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 :

event vs signal


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut event vs signal
    Bonjour,

    Quel est la différence entre un signal et un évenement sous QT :
    par exemple la différence entre faire

    emit mon_signal();
    et
    sendEvent();

    Avec sendEvent est on sûr que le code de réception soit éxécuté immédiatement ou est ce mis dans une queue event

    plusieurs questions donc, merci!

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    ça pourrait faire une entrée dans la FAQ QT peut être !

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Les événements ne sont jamais synchrones car dispatchés par la boucle des messages.

  4. #4
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    Avec sendEvent est on sûr que le code de réception soit éxécuté immédiatement ou est ce mis dans une queue event ?
    C'est justement la différence entre un signal et un événement :

    - un signal (emit CeciCela) est exécuté immédiatement, c'est l'équivalent d'un appel de fonction vers chacun des slots connectés à ce signal (*)

    - un événement est d'abord posté dans la file d'attente de la queue d'événements et sera traité dès que l'application exécutera à nouveau la boucle d'événements, donc plus tard.

    C'est d'ailleurs pour cette raison qu'existe la fonction deleteLater() : si un objet monButton émet un signal 'clicked' qui lui même est connecté à un slot 'onButtonClicked' de maFenetre, je n'ai pas le droit de faire dans 'onButtonClicked' un 'delete monButton' : en effet, 'onButtonClicked' est appelé directement par monButton, donc quand on retournera de 'onButtonClicked', la pile d'exécution devrait continuer dans monButton ... qui vient d'être deleté => crash car on a corrompu la pile d'exécution.

    La solution est d'utiliser 'monButton.deleteLater()' au lieu de 'delete monButton' : ça postera un événement dans la boucle d'événements qui sera traité après que la pile d'exécution soit sortie du traitement du signal monbutton, donc la pile d'exécution ne contiendra plus de référence à monButton.

    (*) il y a une exception à cela: quand un signal est connecté à un slot d'un objet appartenant à autre thread: comme on n'a pas le droit d'aller 'taper' dans les objets d'un autre thread, c'est à la place un événement 'activer slot ceciCela' qui est alors ajouté dans la liste d'événement du thread différent. cf. Qt::ConnexionType.

  5. #5
    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 guillaume07 Voir le message
    ça pourrait faire une entrée dans la FAQ QT peut être !
    oui, très bonne idée.

    Citation Envoyé par nouknouk Voir le message
    C'est justement la différence entre un signal et un événement :

    - un signal (emit CeciCela) est exécuté immédiatement, c'est l'équivalent d'un appel de fonction vers chacun des slots connectés à ce signal (*)

    - un événement est d'abord posté dans la file d'attente de la queue d'événements et sera traité dès que l'application exécutera à nouveau la boucle d'événements, donc plus tard.

    C'est d'ailleurs pour cette raison qu'existe la fonction deleteLater() : si un objet monButton émet un signal 'clicked' qui lui même est connecté à un slot 'onButtonClicked' de maFenetre, je n'ai pas le droit de faire dans 'onButtonClicked' un 'delete monButton' : en effet, 'onButtonClicked' est appelé directement par monButton, donc quand on retournera de 'onButtonClicked', la pile d'exécution devrait continuer dans monButton ... qui vient d'être deleté => crash car on a corrompu la pile d'exécution.

    La solution est d'utiliser 'monButton.deleteLater()' au lieu de 'delete monButton' : ça postera un événement dans la boucle d'événements qui sera traité après que la pile d'exécution soit sortie du traitement du signal monbutton, donc la pile d'exécution ne contiendra plus de référence à monButton.

    (*) il y a une exception à cela: quand un signal est connecté à un slot d'un objet appartenant à autre thread: comme on n'a pas le droit d'aller 'taper' dans les objets d'un autre thread, c'est à la place un événement 'activer slot ceciCela' qui est alors ajouté dans la liste d'événement du thread différent. cf. Qt::ConnexionType.
    ca fait une bonne ébauche. Si cela te dit te faire la QR

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    ah voilà, je pensais aussi que la différence devait se situer ici, exec séquentielle vs file d'attente, mais dans un de mes softs, justement le signal n'est pas exec tout de suite. il s'agit donc de l'exception que tu as mentioné, c'est à dire le cas où un thread effectue un emit et que le slot se situe dans un autre thread, tout s'explique!

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2010, 21h32
  2. [g_signal_emit_by_name] Emettre un signal "expose-event"
    Par Gamall dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 07/02/2010, 21h10
  3. Synchronisation de Threads avec un systeme de signal/event
    Par Niklaos dans le forum Threads & Processus
    Réponses: 23
    Dernier message: 03/01/2010, 19h01
  4. [VB6] [MDI] Signaler la fermeture d'une fille à la mère
    Par cpri1shoot dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/04/2004, 08h57
  5. Interception du signal SIGINT
    Par macleod dans le forum MFC
    Réponses: 2
    Dernier message: 01/07/2003, 18h39

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