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

GUI Python Discussion :

IHM qui freeze lors d'utilisation subprocess


Sujet :

GUI Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut IHM qui freeze lors d'utilisation subprocess
    Bonjour à tous,

    Je suis en train de travailler sr la V2.0.0 de mon logiciel Open Source PYXMAKER.

    Je suis confronté à un petit soucis pour lequel je n'ai pas vraiment trouvé de solution et pour lequel je sollicite votre aide.

    Ce logiciel permet d'automatiser et simplifier la generation de standalone windows et de setup d'install, via IHM, à partir de code source python via un interfacage avec cx_freeze et inno setup.

    Tout se passe de manière graphique, plus de script à créer. Lors de la validation (bouton du dernier ecran, puis bouton de la fenetre pop up qui suit), l'IHM se fige.

    Lors de cette validation, j'appelle une fonction qui fait d'abord appel à cx_freeze, puis à inno setup. Pour ces appels, j'utilise subprocess.popen. Pour etre sur que ces taches s'exécute de manière procedurale, j'utilise egalement un subprocess.wait.

    Le probleme est que cela freeze mon IHM, normal me direz vous, on attend la fin de l'execution des commande avant de rendre la main à l'IHM.

    La solution est d'appeler cette fonction dans un thread séparé de mon thread normal, puis de capturer la fin de ce thread parallele afin d'avertir l'utilisateur.

    Jusqu'ici je n'ai pas reussi (utiliser de threading.thread), d'ou ce post.

    Les sources sont en PJ, si certaines personnes veulent regarder de plus près. J'ai également joint un autre de mes logiciels pour avoir un exemple de sources compatibles (un certains formalisme est obligatoire pour que pyxmaker fonctionne).

    Merci beaucoup d'avance.

    EDIT: l'appel se fait dans ihm_pyxmaker.py, aux alentour de la ligne 1690 (rtr = ...)
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si tu avais choisi PyQt4, je t'aurais proposé la solution suivante. Peut-être y a-t-il l'équivalent en PyGtk:

    - utiliser QThread plutôt que threading pour permettre l'échange de messages
    - faire que le thread envoie un message de fin à l'ihm
    - le message de fin reçu par l'ihm exécute la méthode prévue dans ce cas
    - ce message peut porter des données Python pour permettre à l'ihm de récupérer des résultats.

    Attention: dans la plupart des bibliothèques graphiques, il n'est pas permis aux threads de toucher directement au graphique. D'où l'échange de messages.

    En faisant comme ça, l'ihm n'est jamais figé pendant l'exécution du thread.

    A noter qu'avec threading, il y a aussi une solution: au lieu de bloquer l'ihm en attendant que le thread se termine, on peut tester périodiquement si le thread est toujours en vie avec "isAlive".

  3. #3
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonjour Tyrtamos,

    Je ne connaissais pas isAlive. Je vais chercher de ce coté du coup. Merci beaucoup

    Je reviens d'ici de midi pour poster mes resultats de test

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu ne dis pas pourquoi tu n'es pas parvenu à lancer subprocess dans un thread, quel problème cela présentait il ?

  5. #5
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonjour VinsS,

    En fait j'ai eu deux cas: ou le code de l'appel ne s’exécutait pas, ou bien j'avais des messages d'erreurs divers et variés (je ne me rappelle plus lesquels).

    Quoiqu'il en soit, cela ne fonctionnait pas. Apres pas mal d'essais, je me suis alors decidé à demander un peu d'aide et conseils.

    EDIT:
    En fait ce que j'ai actuellement c'est (grosso modo) ceci:
    --Appel de ma fonction
    --Freezage IHM jusqu'à fin fonction
    --Execution du code qui suit

    Ce que je desirerais obtenir au final
    --Appel de ma fonction en parallèle
    --L'IHM continue normalement, quand la fonction à fini, elle execute une fonction dans le code de l'IHM (declenchement d'une exeption,MAJ d'une variable, ...)

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Juste un petit complément pour utiliser isAlive dans une ihm.

    Une ihm est pilotée par une boucle qui traite les instructions (messages, évènements, ...) en attente quand il y en a.

    Avec PyGtk, il devrait y avoir une méthode qu'on peut appeler dans le code de l'ihm et qui lui dit: "exécuter les instructions en attente, et revenez quand il n'y en a plus".

    Si c'est le cas, voilà comment faire juste après le code qui a lancé le thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while monthread.isAlive():
        execinstructionsihm()
     
    # ici, le thread a terminé son boulot: on peut faire la suite
    Avec ça, l'ihm n'est pas figé, et on sait quand le thread se termine.

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

Discussions similaires

  1. Thread qui freeze lors des breakpoints.
    Par zeguiz dans le forum VB.NET
    Réponses: 3
    Dernier message: 18/01/2012, 17h22
  2. Réponses: 5
    Dernier message: 30/04/2007, 15h32
  3. Message d'erreur lors d'utilisation d'un Objet
    Par dirty_boy dans le forum Langage
    Réponses: 3
    Dernier message: 28/10/2005, 16h16
  4. récupérer l' IP du client lors d'utilisation de sockets
    Par zegota dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 27/07/2005, 22h27
  5. Ou trouver les informations qui defile lors du boot ?
    Par piff62 dans le forum Administration système
    Réponses: 2
    Dernier message: 17/03/2005, 17h19

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