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 :

Gérer l'exécution des événements au retour d'un thread ?


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Par défaut Gérer l'exécution des événements au retour d'un thread ?
    Bonjour,

    Je developpe une application qui affiche des textures procedurales calculées en continue.
    Mon thread principal (A) gere les evenement souris et receptionne des nouvelles textures, pendant qu'un thread parallele (B) calcule le contenu des textures au fur et a mesure et les envois a (A) via des slots.

    Le problème c'est que ces evenements slots arrivant dans (A) sont suffisament rapprochés pour que tous les evenements souris arrivant dans (A) soient ignorés: du coup j'ai bien la mise a jour des textures, mais je ne peux plus traiter les evenements souris. Si j'intercalle un QCoreApplication::processevents() a l'arrivée de mon slot dans (A) je peux à nouveau receptionner des evenements souris, mais dans ce cas si je bouge la souris sans m'arreter tous les evenements souris (A) bloquent la queue de traitement de mes slot venant de (B)...!

    Quelle solution me suggérez vous ? Y-a t-il moyen de ne faire traiter qu'un seul evenement en attente, de manière à par exemple alterner traitement souris/traitement texture ?

    Merci !

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Bonjour,

    Le problème c'est que ces evenements slots arrivant dans (A) sont suffisament rapprochés pour que tous les evenements souris arrivant dans (A) soient ignorés:
    Je ne comprends pas trop cela. Comment des events peuvent être ignorés ? Pour moi, s'ils ne sont pas traités, c'est que ton application est gelée, et qu'elle n'est en fait pas multithread (ou que la priorité relative des threads n'est pas adaptée).

    A mon avis, si ton application était correctement threadée, tu n'aurais pas à t'embêter à gérer les événements individuellement.

    Si tu peux nous mettre un bout de code sur la création de tes threads, on pourra peut être t'aider.

    G.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Par défaut
    Les threads fonctionnent, mais le traitement des données arrivant de B vers A gèlent l'application qui repose sur le thread A (B débite trop rapidement vers A pour que A ai le temps de traiter le moindre évènement souris).

    Du coup si j'intercalle un processEvents() en A à l'endroit ou arrivent les données de B, je récupere du temps de traitement pour les evenements souris, mais du coup si je bouge la souris sans m'arreter (flux continue d'evenements souris), ce sont les evenements souis qui bloquent le traitement des données arrivants de B ! (la queue de slots B->A s'accumule sans jamais etre traité, sauf quand j'arrete de bouger la souris).

    B { boucle de traitement, envois resultats au fur et a mesure }
    A { reception et traitement des resultats, traitement des evenements souris }

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Les threads fonctionnent, mais le traitement des données arrivant de B vers A gèlent l'application qui repose sur le thread A (B débite trop rapidement vers A pour que A ai le temps de traiter le moindre évènement souris).
    Je me permets un peu d'insister, mais je ne veux surtout pas t'offenser.
    Pour moi, s'il y a freeze, alors l'application n'est pas correctement threadée.
    J'insiste car nombreux sont ceux qui font des erreurs (moi le premier !) dans l'utilisation des threads Qt, et ne connaissant pas ton expérience dans le domaine, une erreur dans l'initialisation des threads me semble la plus probable.

    Sinon, je ne peux pas t'aider davantage avec les informations que tu as fournis. Tu peux essayer de diminuer la fréquence d'appel des slots en augmentant la quantité de calcul du thread B à chaque appel. Essaie aussi d'optimiser la gestion de tes évènements souris.

    G.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/10/2013, 22h37
  2. Réponses: 7
    Dernier message: 19/08/2013, 09h30
  3. [Lazarus] Créer un bouton et gérer des événements
    Par ryuphenix dans le forum Lazarus
    Réponses: 1
    Dernier message: 01/08/2010, 09h36
  4. ordre d'exécution des événements onblur et onfocus
    Par letycaf dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/05/2006, 15h30

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