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 :

Application restant gelée


Sujet :

Multithreading

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Application restant gelée
    Bonjour à tous,

    Je suis débutant en Qt, et je développe (je fais de mon mieux) une application qui nécessite à un moment donnée plusieurs appelle de fonction qui peuvent durer un peu de temps.
    je voudrais pouvoir afficher dans une QProgressBar la progression de mon "workflow" ainsi que certaines informations sur son bon déroulement.

    Je voudrait donc exécuter ces fonctions dans un thread, afin que mon application ne soit pas gelée.
    j'ai cru comprendre en cherchant sur le net que c'était possible avec le framework QtConcurrent. j'ai donc fait quelque chose de tous simple pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    bool
    ctrlAcrControl::update()
    {
        qDebug() << "prepare process in thread" << QThread::currentThreadId();
     
        QFutureWatcher<void> futureWatcher;
     
        // Start the computation.
        futureWatcher.setFuture(QtConcurrent::run(this, &ctrlAcrControl::runProcess));
        futureWatcher.waitForFinished();
    }
    et plus loin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void
    ctrlAcrControl::runProcess()
    {
        qDebug() << "do process in thread" << QThread::currentThreadId();
        // ... mon code ..
    }
    le debug me dit bien que les deux fonctions sont dans des thread différents. mais mon application est toujours gelée.

    j'ai manqué quelque chose, c'est pas du tous ça qu'il fallait faire ?

    Si quelqu'un peut m'éclaire c'est pas de refus, j’avoue que je suis un peu perdu .

  2. #2
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    Par défaut
    Salut !
    Déjà, pour résoudre ton problème, je te conseille d'aller faire un tour du coté de ce tuto

    Au lieu d'utiliser des threads, ne pourrait-tu pas utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QCoreApplication::processEvents()
    régulièrement au milieu de tes opérations longues ?

    Bon courage !
    Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta réponse,

    je lit ton tuto (que je n'avais pas vu d'ailleurs). et je regarde comment fonctionne
    QCoreApplication::processEvents()

  4. #4
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    Par défaut
    De manière régulière, il regarde les évenements en attente et les gère.
    Je ne sais pas en quoi consiste tes opérations longues, mais je pense qu'elles sont imbriqués dans une boucle.
    Tu peux faire un truc du genre :
    for(int i=0 ; i<1000 ; i++)
    {
    //tes opérations
    QCoreApplication::processEvents()
    }
    Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    En fait non, ce qui me gène c'est que mes opération longue ne sont pas imbriquée dans une boucle et il est difficile de les séparer en petites étapes. en fait il s'agit d'une série de mesures et de postprocessing (du type recalage denoising resampling etc...) faites sur des images. (différents pour chaque images).

    j'avoue que j'ai un peu de mal à déterminer quelle méthode est la plus adapter à mon cas.
    le résultats que j’aimerai obtenir est le suivant:

    l'avancée de mes opération est affichée dans une barre de progression (l'ensemble des traitement dure environ 1 minute) et des information de log sont affichée dans cette fenêtre.
    la fenêtre est modale l'utilisateur n'a donc pas accès au reste de l'application pendant ce temps. cependant je voudrais que la progression de la barre et l'affichage des log se fasse de manière fluide, et ne pas avoir de frise si l'utilisateur déplace la fenêtre. les opérations peuvent facilement être interrompues via un bouton cancel.

    du coup tu vois je ne suis pas certain que la solution du QCoreApplication::processEvents() soit la meilleur je risque de me retrouver a en mettre un peu partout, sans savoir vraiment ou les mettre.

    j'ai l'impression que la solution la plus adapter est celle du thread travailleur, dans ton lien il est dit :
    Une solution différente consiste à éviter de bloquer la boucle d'événement principale en réalisant les opérations longues dans un thread séparé. C'est tout particulièrement utile si la tâche est réalisée par une bibliothèque tierce de façon bloquante. Dans une telle situation, il peut ne pas être possible de l'interrompre pour laisser l'IHM traiter les événements en attente.
    par contre ça m'a pas l'aire d’être la solution la plus évidente à mettre en place...

    si je me trompe ou si tu as d'autre suggestion je suis bien entendu toujours preneur

Discussions similaires

  1. Application de poste restante
    Par rodbeck dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 20/05/2010, 22h58
  2. [synchronized][multithread] application gelée
    Par sami44 dans le forum Langage
    Réponses: 2
    Dernier message: 10/01/2008, 17h49
  3. Tuer régulièrement les applications gelées
    Par guidav dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 20/12/2007, 18h32
  4. Réponses: 2
    Dernier message: 15/04/2002, 12h56

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