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

C# Discussion :

Proteger une structure ou classe d'accès concurrent


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2011
    Messages : 5
    Par défaut Proteger une structure ou classe d'accès concurrent
    Bonjour ,

    J'ai une HMI qui communique avec un µC , je récupère de ce µC une trame via port série qui contient environ 20 champs .
    Cette HMI sert à piloter une machine avec différent actionneurs, je récupère donc l’état de la machine et des actionneurs
    Un thread spécifique s'occupe de récupérer cette trame tout les 500 ms

    J'ai donc créer une class RS_COM qui gère la COM entre le µC et le PC
    J'ai ensuite créer un class Controleur qui va gérer directement la machine (exemple démarre moteur 3 pendant 5 sec)
    Mon HMI va ensuite envoyer ces commandes en fonction des séquence choisi par l'utilisateur .

    J'ai mis toute les données de la trame dans une classe MACHINE_STATUS
    L'HMI vient donc ensuite lire les propriétés de cette classe à n'importe quel moment .

    Comment faire pour être sur que les 2 thread (HMI et refresh) ne vont pas venir lire et écrire la structure en même temps.Et qu'une lecture ne puissent pas être effectuer tant que le rafraichissement complet n'est pas fini


    J'ai pour idée de
    -mettre une barrière sur l’écriture ( le rafraichissement ) avec un Autoreset event .
    -déclare une instance de ma classe Machine_Status en propriété de ma classe controleur et mettre cette même barrière sur le GET de la propriété..

    Qu'en pensez vous , je débute et j'ai trouver cette méthode mais je voudrais savoir si il y a mieux ou plus simple..

    Merci d'avance pour votre aide !

  2. #2
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Le principe de sémaphore me parait ici correspondre à ton besoin, d'autant que c'est un concept rudimentaire de l'informatique embarquée.

    De ce que je me rappelle du fonctionnement, l'algo serait de ce type :

    Initialisation
    Sem = 1

    HMI
    P(Sem)
    Lecture valeurs
    V(Sem)

    Refresh
    P(Sem)
    Update valeurs
    V(Sem)

    P décrémente la valeur de la sémaphore, V l'incrémente.
    Quand Sem vaut 0, P est en attente.

  3. #3
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Un simple lock ne suffirait-il pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    lock(unObjdeLock)
    {
      //faire les choses sur mon objet
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    J'aurais tendance à utiliser un Lock

    Mais aussi faire en sorte d'utiliser un tampon pour la trame.

    J'explique.

    Le thread qui récupère les informations de la trame peut mettre les données dans une file d'attente. Une fois la trame complètement lu, la donnée peut-etre transférée dans ta structure "partagée" via un lock qui évitera lecture ou écriture par un autre thread durant ce cours temps de transfert des données.

    Le plus simple quand on travaille avec des données qui peuvent être modifiées par un autre thread est de travaillé avec des "copies" de structures.

    Dans le monde de la 3D, souvent, on utilise des techniques de triples buffering pour eviter que le thread de Rendu (qui doit "pédaler" à fond) est un risque d'avoir des données corrompu par le thread de mise à jour des données (position, orientation,etc...)

    enfin, ca serait une approche que j'étudierais !!!

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    pour plus de performances que le lock : readerwriterlock
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    voir le : readerWriterLockSlim (conseillé par le msdn car plus rapide et plus simple)

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/05/2010, 13h04
  2. Réponses: 9
    Dernier message: 15/02/2006, 20h54
  3. declaration d'une structure dans la class TForm1
    Par mdtdamien dans le forum C++Builder
    Réponses: 1
    Dernier message: 15/02/2006, 18h51
  4. accés concurrent à une table
    Par shout dans le forum Oracle
    Réponses: 5
    Dernier message: 06/10/2005, 10h54
  5. ou mettre une structure utilisée par une classe
    Par grand's dans le forum C++
    Réponses: 10
    Dernier message: 28/07/2005, 18h53

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