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 :

Les thread Qt


Sujet :

Multithreading

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut Les thread Qt
    Bonjour.

    Je souhaiterais créer un Thread via Qt. La documentation propose quelques exemples concernant ces derniers, néanmoins, ca ne convient pas réellement à mes attentes.

    Il semblerais que sous Qt, un Thread nécessite la création d'une classe. Je souhaiterais faire abstraction de ce point, pour, non pas avoir une classe, mais simplement une méthode. Quelque chose du style CreateThread(), mais spécifique à Qt.

    Est-ce possible ? Et si oui, de quelle manière ?

    Cordialement,
    PKO

  2. #2
    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
    Salut
    Citation Envoyé par Altess Voir le message
    Je souhaiterais créer un Thread via Qt. La documentation propose quelques exemples concernant ces derniers, néanmoins, ca ne convient pas réellement à mes attentes.

    Il semblerais que sous Qt, un Thread nécessite la création d'une classe. Je souhaiterais faire abstraction de ce point, pour, non pas avoir une classe, mais simplement une méthode. Quelque chose du style CreateThread(), mais spécifique à Qt.
    Difficile de te répondre comme cela. A la limite je te dirait de regarder les QtConcurrent, mais tout dépend de cette question

    Que veut tu faire avec cette thread?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Bonjour et Merci d'avoir replacer le post.

    En fait j'ai une classe qui hérite d'un QWIdget.

    class FenInstall: public QWidget, private Ui::Form_install{...}

    Et dans ce QWidget, j'ai une ListBox qui indique les étapes de mon application, du style :

    - Etape 1 : Analyse ... Terminée
    - Etape 2 : Création ... Terminée
    [...]
    - Etape n : Fin de l'application
    Le soucis, c'est que mes indications n'apparaissent pas au fur et à mesure, mais toutes d'un coup, a la fin de l'application. J'ai donc tenter ca :

    class FenInstall: public QWidget, private Ui::Form_install, public QThread

    Ceci, dans le but d'utiliser une méthode Run dans ma classe. Mais ça fonctionne pas. En gros, je n'arrive pas a utiliser les Thread dans la classe qui hérite déjà de QWidget. Il semblerais que depuis la version 4, l'héritage QWidget / QThread ne fasse pas bon ménage.

    Je me suis donc orienter vers la création d'une méthode Thread, qui se verra passer en paramètre mes indications a afficher dans la listeBox.

    Après, il est fort probable que ce soit pas la bonne solution cette histoire de méthode Thread. Si vous avez une idée de comment faire pour utiliser les Thread dans ma classe QWidget, je prend.

    Cordialement,
    PKO

  4. #4
    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 Altess Voir le message
    Le soucis, c'est que mes indications n'apparaissent pas au fur et à mesure, mais toutes d'un coup, a la fin de l'application. J'ai donc tenter ca :

    class FenInstall: public QWidget, private Ui::Form_install, public QThread
    alors là, je t'arrête tous de suite, JAMAIS de traitement IHM dans un THREAD
    Dans ton cas, je proposerais trois solutions :
    1- tu appel régulièrement la fonction static QCoreApplication::processEvents pour permettre la partie IHM de faire ses traitement

    2- Tu créé un thread qui te fait l'installation et transmet son avancement vers l'ihm par des signal/slot

    Vue ton cas la première semble amplement suffisante. Je ne vois pas beaucoup d'intérêt à utiliser un thread. Par contre découpe bien les étapes en fonction. Il te faudra surement pouvoir stopper l'installation.

    Pour bien te former tu peu voir aussi les tutoriels et cours pour apprendre Qt : http://qt.developpez.com/tutoriels/

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Yan > Merci pour ces informations. En ce qui concerne la remarque "JAMAIS de traitement IHM dans un THREAD", je met ça dans un coin de ma tête, et je ne referais plus la bêtise .

    Effectivement, la méthode "QCoreApplication::processEvents" marche à merveille, c'est exactement ce que je cherchais. Je vais jeter un oeil dans la doc pour savoir ce qui se passe vraiment lors de l'appel.

    L'étape 2 me sera sans doute utiles un jour ou l'autre, néanmoins, elle me semble bien complexe. Est-ce accessible, ou bien vraiment trop complexe ?

    Enfin, "Dans ton cas, je proposerais trois solutions :". Y'en à une troisième ou pas, juste pour info ?

    Merci encore.
    Cordialement,
    PKO

  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 Altess Voir le message
    Effectivement, la méthode "QCoreApplication::processEvents" marche à merveille, c'est exactement ce que je cherchais. Je vais jeter un oeil dans la doc pour savoir ce qui se passe vraiment lors de l'appel.
    Ca execute ce qu'il y as dans l'eventloop. Comment le rafraichissement de l'ihm par exemple.

    L'étape 2 me sera sans doute utiles un jour ou l'autre, néanmoins, elle me semble bien complexe. Est-ce accessible, ou bien vraiment trop complexe ?
    Oui et non. Mais si on peut se passer de thread autant évité

    Enfin, "Dans ton cas, je proposerais trois solutions :". Y'en à une troisième ou pas, juste pour info ?
    J'avais une troisième idée avec QtConcurrent::run, mais je ne suis pas sure que cela vaille le coup

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Yan > Merci de ta rapidité.

    L'utilisation de ""QCoreApplication::processEvents" peut elle être régulière ? J'entend par là pouvoir l'appeler fréquemment dans un même petit bout de code, afin d'avoir une actualisation efficace et simple à la fois. Ou bien est-ce déconseillé, à n'utiliser qu'en dernier recourt ?

    Cordialement;
    PKO

  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
    Citation Envoyé par Altess Voir le message
    L'utilisation de ""QCoreApplication::processEvents" peut elle être régulière ? J'entend par là pouvoir l'appeler fréquemment dans un même petit bout de code, afin d'avoir une actualisation efficace et simple à la fois. Ou bien est-ce déconseillé, à n'utiliser qu'en dernier recourt ?
    Oui, au pire, elle ne fera rien, si il n'y as rien à faire.
    C'est le dernier recourt avant d'utiliser un thread. Mais cela peut généré des petits problèmes (voire la doc).
    Mais ça semble correspondre à ton problème.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Yan > Parfait. Merci encore pour toutes ces informations.

    Cordialement,
    PKO

  10. #10
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Pour appeler processEvents, j'ajouterais un léger bémol: ne l'appel pas trop souvent où tu ralentiras vraiment beaucoup le traitement que tu fais.

    Seul toi peut savoir s'il vaut mieux appeler processEvents toutes les 2, 5, 10, 100 itérations (une étape de tes tâches), ou s'il vaut mieux créer un thread/suite de tâche par QFuture (qui me semble plus adapté pour modéliser un pipeline de tâches lourds) avec laquelle tu es sûr que l'application sera réactive aux entrées utilisateurs et autres événements, et que tes tâches tourneront à une vitesse correcte.

  11. #11
    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 IrmatDen Voir le message
    ou s'il vaut mieux créer un thread/suite de tâche par QFuture (qui me semble plus adapté pour modéliser un pipeline de tâches lourds)
    Au final je n'ai pas parlé de cela car je ne vois pas trop comment arrêter proprement l'exécution.
    Par exemple le run exécute une boucle qui fait des copie. Comment faire pour stopper les copie en plein millieu?

  12. #12
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    QFutureWatcher dispose d'un slot cancel(), pause() ou encore resume(), ça devrait aller

    Par contre, pour annuler les copies déjà effectuées, il faut prévoir un système stockant les objets à supprimer en cas d'annulation.

  13. #13
    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 IrmatDen Voir le message
    QFutureWatcher dispose d'un slot cancel(), pause() ou encore resume(), ça devrait aller
    cancel : arrête la suite d'exécution à la prochaine itération
    pause : pause la suite d'exécution
    resume : relance la suite d'exécution

    Un cancel sur un QtConcurrent::run ne sert pas à grand chose et dans mon exemple cela ne va pas arrêté la copie. Cela à un intérêt avec les autres algos par contre.

  14. #14
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    D'où la criticité de diviser en sous-tâches si c'est nécessaire. Or dans aucun de ces posts je n'ai lu de besoin particulier en ce sens.
    Donc j'en parle; il est seul maître, et lui seul s'il peut ou non adapter ses tâches à un tel modèle.

  15. #15
    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 IrmatDen Voir le message
    Donc j'en parle; il est seul maître, et lui seul s'il peut ou non adapter ses tâches à un tel modèle.
    Je contredit pas que tu en parle juste pourquoi je n'en ai pas parlé

    En y réfléchissant ça me semble plus propre que d'utiliser processevents en effet. Peut être plus difficile à comprendre comment utiliser par contre.

  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 yan Voir le message
    En y réfléchissant ça me semble plus propre que d'utiliser processevents en effet. Peut être plus difficile à comprendre comment utiliser par contre.
    en faite au final, je sais pas quel est le plus propre
    chaqu'un à ses avantages et inconvénients.

  17. #17
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Tout à fait, c'est pourquoi c'est important d'en parler

    Certains pensent à tord que processEvent est un remède miracle, donc je profite de la moindre citation pour préciser que non, c'est à utiliser aussi soigneusement que des threads (si on veut conserver une vitesse d'exécution et une réactivé aux entrées correctes).

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Bonjour.

    Ce qui me gène avec les Thread, c'est que j'éprouve régulièrement la sensation de ne pas savoir les exploiter au mieux. Et dans ce cas, il est vrai que ProcessEvent me sert de "remède miracle", sans doute a tort.

    Sans doute verrez-vous fleurir dans peu de temps un post de ma part concernant l'utilisation des thread (Qt et autre)

    Cordialement,
    PKO

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide sur les Threads
    Par themoye dans le forum MFC
    Réponses: 24
    Dernier message: 06/03/2005, 15h02
  2. Les Threads... J'en remet une couche :)
    Par Higestromm dans le forum C++
    Réponses: 5
    Dernier message: 17/11/2004, 12h19
  3. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25
  4. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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