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

Dotnet Discussion :

Conception application multi-thread


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut Conception application multi-thread
    Bonsoir,

    Je suis sur un problème d'ordre architectural sur une application C#/WPF.

    Cette application doit pouvoir gérer la lecture simultanée (donc dans des threads) du contenu de divers fichiers (txt, xml, json). Cette partie est OK et est géré dans une classe nommée "Titrage", une instance de la classe gère un fichier.

    J'ai ensuite une classe nommée "Zone" qui est constitué d'une propriété de type "Titrage" et chaque instance de la classe peut lancer un thread.

    J'ai donc une question sur la notification d'une modification du contenu d'un fichier. Je suis parti pour l'instant sur un système d’événement pour notifier la classe "Zone" que "Titrage" à évolué (voir schéma).

    Nom : dsBuffer.png
Affichages : 293
Taille : 73,3 Ko

    Je pensais que c'était une bonne solution pour garder mes classes indépendantes au maximum mais est-ce vraiment le cas ? En écrivant ces lignes, je me dis qu'une simple vérification périodique dans le thread de la classe "Zone" protégé par une sémaphore ferait le boulot ...? Car les évenements sont-ils thread-safe ?

    Merci.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    les events sont threads safe, vu que ce sont des simples appels, mais c'est sur le code que tu mettras dedans qu'il faut faire attention

    il y a différents problèmes avec le multi threading
    le plus connu est qu'il est impossible de modifier l'UI depuis un thread différent de celui qui a créé l'interface (le thread principal donc)
    ici je crois comprendre que ce n'est pas ton cas, donc je ne vais pas détailler les solutions

    après il y a le fait que 2 threads qui vont utiliser la même chose à un instant T peuvent créer un comportement génant
    à savoir a = a +1 par exemple, si 2 threads font ca en même temps et que a vaut 1 au départ il est possible que a valle 2 au lieu de 3
    car a = a + 1 c'est lecture de a puis incrément puis rangement dans a
    donc si les 2 threads lisent en même temps la valeur ca pose problème
    pour éviter ca il y a les locks et readerwriterlockslim, ceci permet de mettre faire en sorte que sur une portion de code définie un seul thread puisse rentrer, le suivant attend que ca soit libre

    les collections et toutes les classes/méthodes non thread safe sont aussi problème
    le plus connu c'est un thread qui fait un foreach et un autre qui fait .add, ca plante direct

    autre problème, la concordance des données
    si dans une classe tu as 3 propriétés écrites par un thread, et lues par un autre, il est possible que le thread lecteur commence à lire la 1ère avant de lire les autres, et que le threads qui écrit commence écrivent entre temps
    donc entre le moment ou tu as lu la 1ère et le moment ou tu vas lire les 2 autres les données reflètent 2 états différents
    pour ca une copie en thread safe des données peut suffire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut
    Merci Pol63 pour ta réponse

    Y'a pas de soucis pour les accès concurrentiel aux propriétés, j'en suis conscient d'ou ma proposition de sémaphore.

    Si je pars bien sur des events, ceux-ci enverrai en argument une instance de type "Contenu" je doit donc protéger les appels à celle-ci dans le code de l’événement ? Un lock par exemple ? Car le but serait de lancer un thread depuis une instance de type "Zone" pour effectuer des actions diverses à chaque changement de "Contenu".

    Si je pars pas sur des events, je suis obligé d'avoir un thread lancé en permanence dans une instance de type "Zone" pour vérifier régulièrement les modifications de "Contenu" dans la propriétés "Titrage". C'est peut-être pas si dégueulasse que çà d'un point vue séparation du code ?

    Merci.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    si A prévient B par event, tu peux faire sans thread qui attend côté B, tu peux aussi démarrer un thread côté B à ce moment là pour traiter les données de B
    attention par contre là aussi si A prévient B plus vite que B traite tu peux alors avoir plusieurs threads sur B
    là aussi il y a des solutions, le backgroundworker par exemple encapsule un thread et a une notion de Busy (déjà en cours)

    après niveau séparation, si B a besoin de connaitre A tu ne pourras rien y faire, et ton code me semble déjà bien séparé si tu as un thread qui lit et un autre qui traite
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut
    Merci pour ton retour.

    J'ai commencé avec un Task plutot qu'un BackgroundWorker mais je pense qu'il y a aussi l'information si un Task est en cours non ?

Discussions similaires

  1. L'utilisation de synchronized dans une application multi-thread
    Par Tigrounette dans le forum Général Java
    Réponses: 9
    Dernier message: 08/04/2008, 11h52
  2. Application multi thread
    Par c-ve dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 11/07/2007, 10h48
  3. Application multi-thread
    Par shirya dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 23/06/2006, 15h53
  4. [Distribué] Application "multi-threaded" distribuée
    Par shirya dans le forum Autres
    Réponses: 2
    Dernier message: 23/06/2006, 15h51
  5. Debug application multi thread
    Par Razowsky dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2005, 18h14

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