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

Python Discussion :

Probleme module Threading avec Py2exe


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Probleme module Threading avec Py2exe
    Bonjour à tous,

    C'est mon premier post sur le forum, soyez indulgent

    Mon problème est que py2exe a quelques problèmes avec le module threading chez moi.

    J'ai bien testé, avec le python le.py, ca fonctionne, mais par le fichier .exe, ca ne fonctionne pas.

    L'application s'ouvre, puis se ferme, et quand je lance le .exe par la console windows, l'application se termine (je veux dire par là que la ligne retourne à C:\Python25> .

    J'ai donc testé avec un simple .py pour tester, et cela fait la même chose.

    Le .py est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import threading
     
    def test (Time=0.5):
    	print "[CC] : TEST"
    	threading.Timer(Time, test, [Time]).start()
     
    test(0.5)
    normalement, toutes les 0.5 secondes, test() devrait être appellé, ce n'est pas le cas, c'est appellé une seule fois. Parfois, avant que le .exe se ferme, on peut apercevoir une ligne d'erreur, mais on ne peut pas la lire, le programme se ferme trop vite ou retourne trop vite à C:\Python25> si il est executé par la console de windows.

    lorsque j'ajoute time.sleep(-1) juste après threading.Timer(Time, test, [Time]).start(), la boucle est bien executée et toutes les 0.5 secondes, test() est executé.

    Il y a vraiment des trucs que je ne comprendrais jamais :p

    J'utilise py2exe depuis +/- 1 semaine, il y a peut être un import supplémentaire ou quelque chose du genre a faire pour faire fonctionner correctement le module theading, je ne sais pas, c'est pour ca que je m'en reviens à vous

    Merci

    A bientôt

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Ce n'est qu'une supposition (je n'utilise pas py2exe), mais le processus est peut-être arrêté dès que le thread principal se termine. Essaie d'utiliser le méthode join de tes threads, qui permet d'attendre que le thread se termine.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Je n'ai pas trop compris ce que tu veux dire

    Ah oui, aussi, avec la méthode que j'ai indiquée, Cela crée toutes les 0.5 un thread en plus, en 5 minutes, je suis passé de 700 +/- Threads a 900 +/-

    Savez vous comment je pourrais faire pour éviter ce petit problème et que ca fonctionne en .exe via py2exe ? J'ai aussi essayé de compiler avec pyinstaller, mais c'est pareil, l'application se ferme

    Merci

    A bientôt

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Quand tu exécutes un programme, le système crée un processus qui ne contient initialement qu'un seul thread, le thread principal. Quand celui-ci se termine, il semblerait que le système force la terminaison du processus, même s'il restait d'autres threads en cours d'exécution.

    Le nombre de threads augmente dans ton cas car chaque thread ne se termine jamais et crée un nouveau thread tous les 0.5 secondes.

    Pour éviter cela, il faut restructurer le code et faire les choses différemment. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mport threading
     
    def test ():
    	print "[CC] : TEST"
     
    while True:
    	t = threading.Timer(0.5, test)
    	t.start()
    	t.join()
    Ici le thread principal crée lui-même tous les threads, mais attend qu'un thread soit terminé avant de créer le suivant.

    [EDIT] Suggestion incorrecte supprimée.

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 474
    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 474
    Points : 9 274
    Points
    9 274
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    L'un des problèmes posés par ce type de codage, c'est qu'il faut que le programme attende que le Timer se termine pour lancer le suivant. Et pendant ce temps-là, il ne peut rien faire.

    Je préfère pour ma part lancer un thread "normal" qui, lui, peut attendre le Timer sans empêcher le programme principal de poursuivre son déroulement normal.

    La solution que j'utilise est ici: http://python.jpvweb.com/mesrecettes...ion_periodique.

    Et, bien sûr, elle fonctionne avec py2exe.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Tout d'abord merci

    Pour la réponse de "dividee",

    ca fonctionne très bien mais avec ce code, l'application est 'freeze' et on ne peut plus rien faire en attendant

    Vous n'auriez pas une autre solution SVP ?

    Pour la réponse de tyrtamos,

    La méthode que tu donnes ne fonctionne pas avec py2exe, parfois, ca génère une erreur mais on a qu'un bout, l'appli se termine trop tot pour avoir la fin de l'erreur.

    Merci

    A bientôt

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Juste pour voir, essaie la solution de tyrtamos en enlevant les appels à setDaemon.

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 474
    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 474
    Points : 9 274
    Points
    9 274
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Messiah93 Voir le message
    Pour la réponse de tyrtamos,
    La méthode que tu donnes ne fonctionne pas avec py2exe, parfois, ca génère une erreur mais on a qu'un bout, l'appli se termine trop tot pour avoir la fin de l'erreur.
    J'avais déjà essayé, et ça marchait. J'ai ré-essayé une vingtaine de fois l'exemple de mon tuto. Je ne trouve aucune erreur d'exécution, et le programme se termine normalement après avoir tout fait:
    - en exécution normale .py
    - avec py2exe

    et, en plus:
    - avec psyco
    - avec py2exe + psyco

    Peut-être y a-t-il un pb de config? J'utilise Python 2.5.

    Donne plus de détails sur ce qui n'a pas marché chez toi.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. pbs module PIL avec py2exe
    Par claude 64 dans le forum Général Python
    Réponses: 5
    Dernier message: 09/01/2013, 21h10
  2. Réponses: 10
    Dernier message: 26/11/2008, 23h18
  3. Probleme de concurrence avec les THREADS
    Par L4BiN dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 31/07/2006, 16h33
  4. [swing] Probleme de thread avec Timer
    Par issou dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 13/05/2006, 22h52
  5. Problème de threads avec pthread_create
    Par 180degrés dans le forum Linux
    Réponses: 6
    Dernier message: 19/12/2005, 12h07

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