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 :

Threading : comment lancer une fonction lorsqu'une variable glabole change de valeur


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 22
    Points
    22
    Par défaut Threading : comment lancer une fonction lorsqu'une variable glabole change de valeur
    Bonjour,

    J'ai une tache en threading qui envoi des trames RS232 et une autre qui reçoit les réponses.
    Lorsque j'envoie un trame, la commande m'est acquitté soit pas OK ou HS.
    Cet acquittement me permet de changer l'état d'une variable globale et donc de continuer ma transmission.

    Mon problème : c'est que je n'arrive pas a faire de pause a ma fonction d'envoi le temps que je reçoive l'acquittement. Une boucle while permettant de scruter toute les 0.5 s la variable me bloque tout mes ressources.

    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 064
    Points : 1 402
    Points
    1 402
    Par défaut
    je code surtout avec pygame donc une des caracteristique la plus interessante est de pouvoir creer et intercepter des evenements. J'en abuse car je trouve absurde de boucler sur une variable pour savoir si sa valeur a changée.
    je ne connais pas les autres libs, mais il doit surement y en avoir une qui gere se genre de situation. Le thread qui reçoit les reponses doit pouvoir declancher un evenement attendu par un autre thread.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 439
    Points : 37 030
    Points
    37 030
    Par défaut
    Bonsoir,

    Si vous expédiez une trame puis attendez l'acquittement avant de traiter la suivante, mettre dans des threads séparées la réception et l'émission des trames me semble plus compliqué que le nécessaire.

    Par contre, vous pouvez dire qu'avec RS232 si on ne lit pas les octets dès qu'ils sont là, le suivant écrase le courant et vous perdez des octets et des trames... Il parait donc sensé de lire et écrire les trames sur le port RS232 de façon asynchrone.

    Mais cela suppose faire 3 threads:

    Une comprenant des fonctions :
    • emission : pose dans une queue la prochaine trame à émettre
    • reception : récupère dans une autre queue la trame reçue

    Queue au sens du module threading.

    Les deux autres threads sont là pour:
    - émission: on attend qu'il y ait une trame à émettre. On la sort de la queue, on l'expédie via la sortie RS232,
    - réception : on attend le marqueur de début de trame, on lit la trame, on vérifie qu'elle est valide et on la dépose dans la queue de réception.

    Dans ces conditions, vous découplez la gestion de l'état de la transmission de la transmission et de la réception tout en disposant de toutes les données nécessaire à cette gestion dans un même thread.
    - W

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Bonsoir,
    Une comprenant des fonctions :
    • emission : pose dans une queue la prochaine trame à émettre
    • reception : récupère dans une autre queue la trame reçue

    Queue au sens du module threading.
    Bonjour,

    Je ne voit pas bien pourquoi ce thread là est nécessaire. Etant donné que l'un de mes threads me permet de remplir une queue (== list ?) et que mon IHM via des scripts me permet de remplir une autre queue qui est dépilé par mon deuxieme thread.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 064
    Points : 1 402
    Points
    1 402
    Par défaut
    je ne comprends par pourquoi il est necessaire d'avoir plusieurs threads. j'ai dans l'idée qu'on ne peut pas lire et en même temps ecrire sur un port; soit il ne se passe rien et on attends, soit on ecrit puis on atends confirmation de la reception, soit on reçoit puis on envoie une confirmation.
    Guillaume M, pourrais-tu m'expliquer le protocole ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    En faite, j'ai des trames sur la RS qui peuvent venir aléatoirement de mon système qui est en face.
    Je ne peut pas me contenter d'envoi une trame et d'attendre l'acquittement de cette trames.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 064
    Points : 1 402
    Points
    1 402
    Par défaut
    désolé, pas comprendre.
    Mon problème : c'est que je n'arrive pas a faire de pause a ma fonction d'envoi le temps que je reçoive l'acquittement. Une boucle while permettant de scruter toute les 0.5 s la variable me bloque tout mes ressources.
    on est d'accord que tu n'envoies rien tant que la reception n'est pas finie.
    pourquoi c'est pas le même thread qui s'occupe des envois/receptions ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 439
    Points : 37 030
    Points
    37 030
    Par défaut
    Citation Envoyé par Guillaume M Voir le message
    Bonjour,

    Je ne voit pas bien pourquoi ce thread là est nécessaire. Etant donné que l'un de mes threads me permet de remplir une queue (== list ?) et que mon IHM via des scripts me permet de remplir une autre queue qui est dépilé par mon deuxieme thread.
    Ce qui est asynchrone, c'est l'arrivée ou l'émission des trames.
    C'est exactement ce que vous à proposé Josmiley dans la

    Ces activités là dorment tant qu'il n'y a pas de trame à émettre ou des octets à lire qui seront ou pas de bonnes trames, reçue avant ou pas un timeout.

    discussion

    Mais cela ne fait que vider ou remplir des listes (qui mériteraient être des Queue) reste à écrire la logique qui attend l'acquittement avant d'expédier la trame suivante.

    Soit vous mettez cela dans un même thread et vous n'avez pas de problème de variable globale, soit vous choisissez de séparer et faire remonter les acquittements 'à part'.

    Il n'est à priori utile de séparer vous souhaiter utiliser cela pour échanger des trames dans les deux sens avec un piggyback des acquittements.
    -W

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 439
    Points : 37 030
    Points
    37 030
    Par défaut
    Citation Envoyé par josmiley Voir le message
    on est d'accord que tu n'envoies rien tant que la reception n'est pas finie. pourquoi c'est pas le même thread qui s'occupe des envois/receptions ?
    Effectivement, si ce n'est que pour faire du start/stop, inutile de multiplier les threads. Une seule suffit et comme l'émission et la réception des caractères est lente (RS232 c'est 19.6 Kdbs ou 2KB/s), ce thread ne fait rien sinon attendre réception ou timeout.

    De plus même si on voulait faire du pipelining (envoi de plusieurs trames sans attente de l'acquittement) ce serait largement suffisant.
    Ce qu'il peut être nécessaire de découpler c'est l'expédition et la réception des octets sur la ligne.
    - W

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/07/2015, 21h45
  2. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 11h18
  3. comment utiliser un programme comme une fonction dans une macro exel
    Par ERICKO dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/10/2007, 00h39
  4. comment creer le titre d'une legend par une fonction javascript
    Par raul_le_vieux dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/06/2007, 17h18
  5. Réponses: 4
    Dernier message: 17/03/2004, 18h24

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