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 :

Attendre l'exécution d'une fonction


Sujet :

Qt

  1. #1
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut Attendre l'exécution d'une fonction
    Bonjour à tous,

    Je cherche une façon de faire patienter l'utilisateur pendant l'exécution d'une fonction de chiffrement qui pourrait prendre un peu de temps.

    Afficher une animation -par exemple- qui empêche l'utilisateur de retourner à la fenêtre principale. (fenêtre modale)

    Merci.
    Shan.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 060
    Billets dans le blog
    142
    Par défaut
    Bonjour,

    Une QProgressDialog ? (Documentation 4.7 -> http://qt.developpez.com/doc/4.7/qprogressdialog/ )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    Est-ce qu'il y a moyen de ne pas mettre de bouton "cancel".. je ne veux pas de bouton. et pas de possibilité de fermer la QProgressDialog avant sa terminaison non plus?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 060
    Billets dans le blog
    142
    Par défaut
    Oui, avec setCancelButton(NULL) -> http://qt.developpez.com/doc/4.7/qpr...etcancelbutton
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Par contre pour empêcher la fermeture :

    - empêcher l'événement de fermeture d'agir
    => closeEvent->ignore()
    Soit tu redéfinis QProgressDialog et son closeEvent(), soit tu installes un filtre d'événement (voir FAQ).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    bool Widget::eventFilter ( QObject* o, QEvent* e )
    {
        if (qobject_cast<QProgressDialog*>(o) && e->type() == QEvent::Close)
        {
            e->ignore();
            return true;
        }
    
        return QWidget::eventFilter(o,e);
    }
    - cacher la barre de titre, ou alors juste désactiver le bouton close...
    => il faut jouer avec les WindowType.

    Exemple complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QProgressDialog progress(&w, Qt::FramelessWindowHint);
    progress.setWindowModality(Qt::WindowModal);
    progress.setMinimum(0);
    progress.setMaximum(0);
    progress.setCancelButton(0);
    progress.installEventFilter(&w); // w est le Widget dont j'ai redéfini l'eventFilter ci-dessus
    progress.exec();

  6. #6
    Expert confirmé

    Avatar de Francis Walter
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 2 315
    Par défaut
    Au démarrage de l'exécution de la fonction, tu peux rendre invisible les buttons (réduire, agrandir et fermer) en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    progressBar->setWindowFlags(Qt::FramelessWindowHint); //Aucun bouton n'apparait
    //ou
    progressBar->setWindowFlags(Qt::WindowStaysOnTopHint); //Le bouton "fermer apparait mais tant que la personne ne clique pas, la fenêtre restera toujours au premier plan*/

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Citation Envoyé par zentaf Voir le message
    Est-ce qu'il y a moyen de ne pas mettre de bouton "cancel".. je ne veux pas de bouton. et pas de possibilité de fermer la QProgressDialog avant sa terminaison non plus?
    C'est un peu hors sujet mais réalises-tu combien cela risque d'être pénible pour l'utilisateur ?

    Est-ce qu'il y a une raison « politique » valable d'agir ainsi ou est-ce que c'est uniquement pour éviter de se retrouver logiciellement dans une impasse ?

  8. #8
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    C'est un peu hors sujet mais réalises-tu combien cela risque d'être pénible pour l'utilisateur ?

    Est-ce qu'il y a une raison « politique » valable d'agir ainsi ou est-ce que c'est uniquement pour éviter de se retrouver logiciellement dans une impasse ?
    parce que c'est juste pour montrer à l'utilisateur qu'il y a une opération en cours et même s'il l'a ferme l'opération poursuit son exécution dans mon programme ! je ne lui permets pas de suspendre une opération de chiffrement en cours !

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Citation Envoyé par zentaf Voir le message
    parce que c'est juste pour montrer à l'utilisateur qu'il y a une opération en cours et même s'il l'a ferme l'opération poursuit son exécution dans mon programme ! je ne lui permets pas de suspendre une opération de chiffrement en cours !
    Donc, si l'utilisateur veut abandonner l'opération parce que c'est trop long, il ne peut pas le faire ? Tu ne peux pas prendre ton utilisateur en otage. C'est le meilleur moyen pour donner très mauvaise réputation à ton application, et tu te seras alors donné beaucoup de mal pour rien.

    Dans le cas présent, ton cas de figure est une tâche asynchrone. La meilleure approche consiste à la faire tourner en tâche de fond avec une barre de progression discrète dans un coin de la fenêtre principale de ton application. Pour ce faire, soit tu mets en place une boucle principale, soit tu lances un thread distinct, avec un flag consultatif quelque part qui permet à ce thread d'indiquer s'il a fini ou pas. Tu laisses alors le reste ton application fonctionner normalement et chaque fois qu'elle a besoin d'accéder aux données chiffrées, tu vérifies ce flag pour voir si elles sont disponibles.

    Quelque soit l'application, l'utilisateur doit toujours avoir le dernier mot, et ton application doit en plus être réactive : pas question d'avoir des boutons qui ne redeviennent actifs qu'après un délai de dix secondes ou, pire, au bout d'une durée indéterminée. Dans le meilleur des cas, l'utilisateur désinstalle ton logiciel lorsqu'il a fini de s'en servir. Dans le pire, il peut être interdit d'installation dans un réseau d'entreprise.

  10. #10
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Donc, si l'utilisateur veut abandonner l'opération parce que c'est trop long, il ne peut pas le faire ? Tu ne peux pas prendre ton utilisateur en otage. C'est le meilleur moyen pour donner très mauvaise réputation à ton application, et tu te seras alors donné beaucoup de mal pour rien.

    Dans le cas présent, ton cas de figure est une tâche asynchrone. La meilleure approche consiste à la faire tourner en tâche de fond avec une barre de progression discrète dans un coin de la fenêtre principale de ton application. Pour ce faire, soit tu mets en place une boucle principale, soit tu lances un thread distinct, avec un flag consultatif quelque part qui permet à ce thread d'indiquer s'il a fini ou pas. Tu laisses alors le reste ton application fonctionner normalement et chaque fois qu'elle a besoin d'accéder aux données chiffrées, tu vérifies ce flag pour voir si elles sont disponibles.

    Quelque soit l'application, l'utilisateur doit toujours avoir le dernier mot, et ton application doit en plus être réactive : pas question d'avoir des boutons qui ne redeviennent actifs qu'après un délai de dix secondes ou, pire, au bout d'une durée indéterminée. Dans le meilleur des cas, l'utilisateur désinstalle ton logiciel lorsqu'il a fini de s'en servir. Dans le pire, il peut être interdit d'installation dans un réseau d'entreprise.
    Merci beaucoup.. Je prends tes conseils en considération
    J'avoue.. ce sont les bêtises d'un débutant :/

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/06/2009, 16h50
  2. Stopper l'exécution d'une fonction au bout d'un certain temp
    Par Eagle959 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/03/2006, 18h16
  3. Réponses: 3
    Dernier message: 11/03/2006, 15h35
  4. Pause dans l'exécution d'une fonction
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/06/2005, 07h48
  5. Exécution d'une fonction...
    Par mickeliette dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/11/2004, 16h59

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