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 :

QueuedConnection, quand exactement le slot se lance-t-il ?


Sujet :

Qt

  1. #1
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut QueuedConnection, quand exactement le slot se lance-t-il ?
    Lorsque je suis dans le thread de main() et que mon objet Runner est dans le thread B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Thread main() avec une QEventLoop qui tourne
    Runner runner;
     
    QThread threadB;
    runner->moveToThread(&threadB);
    threadB.start();
     
    // Long traitement, des choses se passent aussi dans le thread B
     
    QMetaObject::invokeMethod(&runner,"process",Qt::QueuedConnection);
     
    // Long traitement
    La doc dit:

    Qt::QueuedConnection : The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
    Donc quand je demande d'invoquer la fonction"process" avec invokeMethod, Qt ajoute un évènement à l'event loop du thread B (pour exécuter la fonction "process") qui sera exécuté une fois que le thread B retournera dans son event loop.

    Ce que je me demande c'est à quel moment cet évenement est ajouté à l'event loop du thread B?
    1) Directement à la ligne QMetaObject::invokeMethod...? Cela veut dire que le thread de main() accède à des ressources du thread B alors qu'il travaille peut être. Les event loop de Qt sont peut être thread safe?
    2) Au retour à l'event loop du thread main()? Ca ne change rien.
    3) Au retour à l'event loop du thread B? Ce qui m'étonnerait, le thread de main() devrait alors attendre le bon moment.

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    Je vous redirige vers une réponse que j'ai écrite à ce sujet il n'y a pas très longtemps pour les explications de QueuedConnection, avec des schémas et plein de choses : http://www.developpez.net/forums/d14...t/#post7999363

    Cela dit, si vous réimplémentez la méthode run() de votre Thread, il n'y aura pas d'eventloop à l'intérieur vu que vous l'aurez bloquée, ce qui pourrait être problématique pour vous.

    N'hésitez pas si vous avez des questions à l'issue de tout cela,

    Bonne journée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Merci j'ai regardé votre réponse. Pour bien comprendre de quoi je parle je profite du schéma:

    Nom : Qt2.png
Affichages : 310
Taille : 17,6 Ko

    Je parle de l'étape: "insertion de l'event dans la queue". On se retrouve dans le cas inverse de mon post d'origine mais le principe est là. Le thread 1 insère un évènement dans la queue du thread de main(). C'est l'équivalent de ma ligne QMetaObject::invokeMethod avec QueuedConnection. Ma question: est-ce que le thread 1 modifie l'event queue du thread de main() directement à la ligne ou j'écris QMetaObject::invokeMethod ? Si oui alors cela implique que l'event queue est thread safe étant donné que le thread de main() peut à tout moment accéder à son event queue une fois un event traité.

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonsoir,

    Oui, cela ajoute directement l'event à l'event queue. Oui aussi, les event queues sont effectivement thread safe, ce qui fait qu'un invokeMethod en QueuedEvent, un postEvent, etc. peuvent être appelés sans avoir à mutexer ou autre. Il faut juste bien faire attention si on passe un pointeur à ce que la ressource reste disponible et qu'il n'y ait pas de problème de concurrence dessus, par exemple. Dans le cas d'un QString par exemple, il sera copié, donc pas de souci là-dessus. Je ne sais pas trop quoi ajouter de plus, est-ce que cela répond à votre question ?

    Bonne soirée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Oui entièrement merci à toi. En fait je voulais être certain de ne pas avoir besoin de retourner dans mon event loop une fois invokeMethod appellée pour que ce soit pris en compte.

  6. #6
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonsoir,

    En fait, c'est bien "pris en compte" (dans le sens où c'est ajouté à l'event queue), mais ce ne sera traité (=> les appels seront effectués) qu'au tour de boucle suivant. Je ne sais pas si c'est bien cela que vous avez compris, je préfère qu'il n'y ait pas de confusion.

    Bonne soirée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  7. #7
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Oui tout à fait, l’événement est ajouté directement, maisil sera traité par le thread receveur comme tout autre événement donc forcément après que les autres qui le précèdent dans la queue soit traités et terminés.

Discussions similaires

  1. .jpeg n'apparaissent pas quand je lance ma servlet ?
    Par haifa28 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 26/03/2007, 15h11
  2. [debutant] quand l'EDT est-il lancé ?
    Par nouknouk dans le forum EDT/SwingWorker
    Réponses: 11
    Dernier message: 04/01/2007, 20h22
  3. Redemarrage quand IE est lancé
    Par kitiss dans le forum Windows XP
    Réponses: 2
    Dernier message: 01/09/2006, 00h11
  4. Réponses: 13
    Dernier message: 12/01/2006, 21h06
  5. [C#] Ne pas voir une fenetre shell quand on lance un process
    Par Vins83 dans le forum Windows Forms
    Réponses: 19
    Dernier message: 24/02/2005, 12h15

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