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

Threads & Processus C++ Discussion :

Ou mettre le thread ?


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 87
    Points
    87
    Par défaut Ou mettre le thread ?
    Bonsoir à tous !

    Voila, je fais appel à votre aide car j'ai un gros problème pour mon programme mais tout d'abord, je vais vous définir le but de ce programme :

    Le programme en question doit être capable de recevoir des trames envoyés par un réseau rs485 modbus (Je suis l'esclave) passant par un adaptateur rs232 pour être branché au PC. En recevant ces trames, je dois les analyser et en extraire certaines données en voici un exemple 0306000020001E828 (2 chiffres = 1 octet)

    En décomposant cette trame :
    -> 03 : Adresse du module
    -> 06 : Fonction (que je ne touche pas)
    -> 00 02 : Marche ou 00 01 : Arrêt
    -> 00 01 : Adresse du registre

    Une fois décomposée, je dois comparer ces valeurs à celles deja contenues dans le programme (en fait c'est comme si je remplacais le régulateur, il a une adresse déjà implémenté et je ne peux pas y toucher [j'espère que je suis clair]). Si les adresses concordent, suivant l'état (Marche ou Arrêt), je dois afficher dans mon IHM un voyant (vert pour Marche et rouge pour Arrêt).

    Pour en revenir au problème, j'ai une classe LiaisonRS232 avec toutes les fonctions pour dialoguer mais on m'a dit que j'avais besoin de thread pour pouvoir analyser une trame dès que j'en recois une.

    Les spécifications du programme :

    - Langage C++
    - IHM en document vue

    Mes principales questions sont : où dois-je placer le thread ? et comment puis je faire un voyant qui change en fonction de ce que j'ai récupéré dans la trame ?

    Si vous voulez voir le programme n'hésiter pas à me le demander (étant donné que c'est mon premier post, si quelqu'un demande mon programme, je souhaiterai qu'il me dise comme je peux l'upper ).


    Merci par avance pour toute l'aide que vous me fournirez !

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Beh le thread il faut le lancer au démarrage de ton application.
    Un thread dédié à l'acquisition ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par hegros
    Beh le thread il faut le lancer au démarrage de ton application.
    Un thread dédié à l'acquisition ?
    Dès que je reçois une trame faut qu'elle "se mette en route" et que j'exécute le code pouvant analyser la trame en question, une sorte d'interruption.

    Je dois peut-être la mettre dans la classe App ? mais c'est que recevoir une trame c'est pas forcément au lancement du programme, je peux en recevoir n'importe quand et il faut que je sois capable de la traiter (Je suis clair dans mes explications ?)

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Comment tu sais que tu viens de recevoir une trame à analyser ?

    Aucune idée de ta class App
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Classiquement, on fait un thread pour l'I/O et un thread pour l'UI.
    Boost ftw

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par hegros
    Comment tu sais que tu viens de recevoir une trame à analyser ?

    Aucune idée de ta class App
    Je reçois une trame quand un autre pc, relié sur le réseau rs485 modbus, interroge mon programme. Donc c'est aléatoire, tout dépend d'un autre pc que je ne controle pas.

    Citation Envoyé par loufoque
    Classiquement, on fait un thread pour l'I/O et un thread pour l'UI.
    Qu'entends-tu parler par l'I/O ? et l'UI ?

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Dans ce cas tu utilises un thread qui fait une lecture asychrone sur ta rs485.

    Tu peux faire une lecture bloquante ou non-bloquante tout dépend des contraintes que tu as.

    I/O = Input/Output
    UI = User Interface ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    927
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 927
    Points : 2 113
    Points
    2 113
    Par défaut
    Citation Envoyé par Nemesis007
    Je dois peut-être la mettre dans la classe App ? mais c'est que recevoir une trame c'est pas forcément au lancement du programme, je peux en recevoir n'importe quand et il faut que je sois capable de la traiter (Je suis clair dans mes explications ?)
    Salut,

    Tu pourras recevoir une trame quand ton programme sera prêt à écouter les messages de l'autre pc, relié sur le réseau rs485 modbus, qui interroge ton programme.

    Pour pouvoir continuer à recevoir des trames en même temps que d'analyser une trame reçue, utiliser un thread serait une solution.

    Ou bien tu fais un seul thread : il faudra que ton programme (qui est en fait le thread principal) envoie la trame à ce thread unique, il analysera les trames. Ca peut être compliqué car ce thread pourrait recevoir plusieurs trames d'affiler pendant qu'il serait déjà en train d'en analyser une, il faudra gérer une file d'attente.

    Donc c'est peut-être plus simple de faire un thread pour chaque trame reçue :
    Tu pourrais démarrer ton thread quand tu reçois un message. Je suppose que tu vois quand je veux dire, tu as surement une fonction qui établit une connexion avec la machine qui interroge ton programme, et une fonction qui reçoit les messages. Alors, à chaque réception de message (de trame), tu lance un thread qui analysera cette trame. Le thread s'occupera d'analyser la trame et, en même temps, ton thread principale continuera à écouter les trames arrivantes et lancera chaque fois un nouveau thread pour analyser ces nouvelles trames reçues.


    Dans la fonction de création de thread, on passe en argument la fonction que le thread exécutera. C'est cette fonction bien sur qui analysera ta trame. Et c'est donc là que tu gèreras ta lumière verte, en affichant une image en fonction de l'état de la lampe par exemple, ou en utilisant une puce que tu active ou désactive...

    En espérant t'avoir aidé et ne pas être passé à côté du principal en parlant de choses plus basiques,
    salut!
    "If you can't teach it then you don't know it."

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    D'après ce que je comprends le traitement à faire sur les trames ne devrait pas être trop gourmand, en créant un nouveau thread chargé d'analyser une nouvelle trame on risque d'avoir une application qui passe son temps à créer et à détruire des threads ce qui est encore plus gourmand.

    Je vois bien

    1 thread d'acquisition/analyse + 1 thread UI

    ou

    1 thread d'acquisition : Récupérer les trames et les envois dans une file de message par exemple
    1 thread d'analyse : Analyse les trames envoyées dans la file de message
    1 thread UI : Chargé de gérer l'IHM
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  10. #10
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 386
    Points
    20 386
    Par défaut
    Avant de se compliquer la vie essayer avec une simple minuterie ou timer ou bien des fonctions qui déterminent une période de temps.
    Si c'est pas assez performant effectivement faire du multiprocessus.

Discussions similaires

  1. mettre un thread en pause
    Par stoner2008 dans le forum Général Python
    Réponses: 19
    Dernier message: 26/04/2012, 09h57
  2. Mettre le thread GUI en pause
    Par luffydu22 dans le forum Multithreading
    Réponses: 0
    Dernier message: 26/12/2010, 13h41
  3. Mettre le thread principal en attente
    Par luffydu22 dans le forum Multithreading
    Réponses: 5
    Dernier message: 07/12/2010, 09h36
  4. mettre un thread en "pose"
    Par goffle dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 13/03/2010, 15h13
  5. Mettre un thread en pause!
    Par Voldo dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 29/03/2008, 18h29

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