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 :

IHM + Console : Bloquant


Sujet :

Qt

  1. #1
    Membre habitué
    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
    Points : 193
    Points
    193
    Par défaut IHM + Console : Bloquant
    Bonjour.

    J'ai codé un petit programme tout simple à l'aide de QTCreator, sous windows, en mode console, qui suite à une analyse, génère un fichier script. Ce fichier script est ensuite passé en paramètre d"un exécutable de création d'image disque. Cet exécutable de création d'image fonctionne exclusivement en mode console, et n'est pas de moi.

    Jusque là, aucun soucis, je lance mon programme, il généré correctement mon fichier script, et fait appel a l'exécutable de création d'image disque. L'appel de cet exécutable se fait tout simplement via la fonction system();
    Mon programme se lance, analyse, génère un script, et lance donc une 2éme console dans laquelle se déroule la création d'image.

    En mode console, ça fonctionne à merveille. Je me suis donc penché vers une petite IHM sans aucun bouton, simplement avec des indications sur l'avancement de la création d'image.

    Mon IHM s'affiche, mon analyse se déroule toujours correctement, idem pour la création du script. Par contre, lorsque je lance la commande system(); , mon IHM se bloque, devient blanche, inaccessible, et une console s'ouvre. Dans cette console se déroule la création de l'image disque. J'ai la possibilité de manipuler cette console, la bouger, déplacer, redimensionner, sans problème. Une fois la création de cette image terminée, mon IHM redevient accessible, et manipulable.

    Donc durant toute ma création d'image, j'ai un gros pavé blanc qui squat mon bureau, et je peut pas le manipuler, il est bloqué.

    Il s'agit sans doute d'une histoire de thread.
    Comment puis-je rendre ma fenêtre accessible même lorsqu'une console de création d'image se lance ?

    merci d'avance.

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    A mon avis le problème vient du fait que ta GUI si j'ai bien compris lance un processus avec sytem(). Je ne sais pas comment fonctionne la commande system mais je pense qu'elle bloque la GUI. En gros tant que ton exécutable de création d'image n'est pas terminer la GUI est bloqué. Il faut que tu regardes soit du cote de ShellExecute (MSDN) ou alors de QProcess ou peut etre QdeskopService.Il faut que tu trouves le moyen de lancer ton programme a partir de ta GUI sans que ta GUI soit entrain d'attendre la fin de l'exe pour passer à la ligne de code suivante.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  3. #3
    Membre habitué
    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
    Points : 193
    Points
    193
    Par défaut
    superjaja > Bonjour et merci de ton aide.
    Effectivement, le lancement de la création d'image disque bloque totalement mon IHM. J'ai réfléchi a une methode de mise en place de thread, et ça fonctionne. J'aurais simplement aimé savoir si cette methode est "correcte" :

    Mon IHM est gérée par mon thread principal (mon main() en fait).
    Depuis ce thread principal, je lance un second thread, qui lui, ne gère QUE l'analyse, le script, et le lancement de l'exécutable de création d'image disque, toujours du via system();. Il ne touche pas du tout a mon IHM.

    J'ai créé un slot, qui, a chaque fin d'étape (Analyse, Création de script, lancement création image disque), envoi un signal a mon thread principal. Et mon thread principal interprète ce signal, et indique en "direct", l'avancement de mon application, via mon IHM. En gros :

    Je lance l'analyse dans mon thread secondaire.
    Je transmet un signal a mon thread principal depuis mon thread secondaire.
    Mon thread principal réceptionne le signal et l'interprète.
    Mon thread principal modifie mon IHM pour indiquer a l'utilisateur que l'analyse est lancée
    ...

    Au final, mes 2 fenêtres sont indépendantes (console et IHM), et j'arrive a interagir entre mes threads afin de savoir où j'en suis dans mon application.

    Ca marche, pas de problème, mais c'est correcte ou pas ?

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

  4. #4
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Je reconnais que le c'est correcte ou pas est pas toujours évident a donner comme ça. Si tu dois mettre a jour ton IHM alors que c'est un traitement long un thread peut être une bonne idée. Après disons que je ne passerai peut être pas par la commande system (pas portable) si QProcess (avec ses signaux et slots) peut faire l'affaire et avec un peut de chance m'éviter de faire une thread (je n'en suis pas sur, j'ai pas assez utiliser QProcess pour te donner plus d'element).
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  5. #5
    Membre éprouvé

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Il existe la méthode startDetached() dans QProcess, qui permet d'éxécuter le processus appelé dans un autre processus système (et donc dans un autre thread). Tu peux essayer ça aussi (et c'est plus simple que de créer des threads toi même).

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Il existe la méthode startDetached() dans QProcess, qui permet d'éxécuter le processus appelé dans un autre processus système (et donc dans un autre thread). Tu peux essayer ça aussi (et c'est plus simple que de créer des threads toi même).

    G.
    Je confirme, avant de passer par un thread utilise QProcess au lieu de système.
    Cette classe est asynchrone.
    Il y as deux trois truc dessus dans la FAQ.

    [edit] Gulish => start et StartDetached lance la commande dans un nouveau process. La différence est que dans le cas de startDetached le process n'est pas enfant du process courant et que l'on ne peut interagir avec.

  7. #7
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Bon et bien je crois qu'au final on est tous d'accord (pour une fois j'ai pas dit trop de bêtises).
    Bon courage pour la suite.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  8. #8
    Membre habitué
    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
    Points : 193
    Points
    193
    Par défaut
    Merci de votre aide à tous.
    Effectivement, QProcess me semble être la solution la mieux adaptée.

    Je test ca, et je fait un retour sur ce poste dés que possible.

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

  9. #9
    Membre habitué
    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
    Points : 193
    Points
    193
    Par défaut
    Bonjour à tous.

    J'ai donc testé QProcess. Le fonctionnement est similaire a la commande system(), mais les possibilités sont bien plus nombreuses. Notamment la methode startDetached(), qui lance la commande dans un tout nouveau process, indépendant du premier.

    Comme Yan l'a dit plus haut, la difficulté réside dans la communication entre les process. Pas facile. Je pense pouvoir m'en sortir avec avec les differents signaux proposés.

    En tout cas, la piste de QProcess est bonne, et bien plus simple a utilisée qu'un thread. Merci de votre aide.

    Bonne semaine.

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

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

Discussions similaires

  1. Affichage d'une console dans IHM Qt
    Par Altess dans le forum Qt
    Réponses: 5
    Dernier message: 01/07/2009, 14h06
  2. Console et Ihm
    Par debutanteVB.NET dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 13/06/2008, 17h44
  3. Réponses: 3
    Dernier message: 16/01/2008, 18h47
  4. IHM + mode console : cacher la console
    Par masacc dans le forum Windows Forms
    Réponses: 8
    Dernier message: 31/07/2007, 09h56
  5. IHM console pour logiciel de base de données
    Par kangourou_for_ever dans le forum Linux
    Réponses: 6
    Dernier message: 03/09/2006, 18h43

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