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 :

Thread et synchronisation


Sujet :

C#

  1. #1
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut Thread et synchronisation
    Bonjour,

    Je voudrais rafraîchir un "control" de ma fenêtre principale depuis une fonction appelée dans une thread.
    J'ai tout d'abord essayé avec les fonctions lock etc. sans succès. J'ai alors cherché sur internet et je suis tombé sur les fonctions Invoke. Rien n'y fait! A chaque fois, j'ai un message m'avertissant que je ne peux pas rafraîchir mon composant depuis ma thread.

    Comment faire svp?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Fais voir ton code pour l'utilisation de Invoke, tu as dû faire une petite erreur...

  3. #3
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Salut,

    Je m'excuse de ne pas avoir pu répondre plus tôt.

    En fait le problème est simple, j'ai créé une classe RS232 qui utilise un composant de type serialport pour gérer une liaison série.
    Pourquoi? Parce que je ne voulais pas que ce composant soit bloquant donc en fait toute la gestion se situe dans un thread. Jusqu'ici aucun problème...
    tout fonctionne parfaitement.

    C'est lorsque j'essaye d'écrire des lignes de debug dans mon interface que cela coince.

    Mes données arrivent dans une boucle de réception que voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public void Receive(object sender, SerialDataReceivedEventArgs e)
    {        
       char c = (char)sp.ReadChar();
     
       Monitor.Enter(this);
       try
       {
          cb(c);
       }
       finally
       {
          Monitor.Exit(this);
       }
    }
    Dans cette boucle, j'appelle une fonction delegate (anciennement callback) qui se situe dans ma classe principale (celle de la form). Et ca ne fonctionne pas... quoique je fasse visual me dit que je ne peux pas modifier un control depuis une fonction appelée par un thread différent

  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
    il faut faire un Invoke de ton delegate de la classe principal

    et au pire, si tu veux faire le cochon pour tester rapidemment ,
    tu mets la ligne suivante dans ta form principale :

    CheckForIllegalCrossThreadCalls = false;

    c'est pas super joli mais bon, ca peut aider de temps en temps (mais chut, dis pas que c'est moi qui t'ai donné ce truc, sinon, je vais me faire trucider par nos amis MVP (thomas & co).. (humour)

    The Monz, Toulouse

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    CheckForIllegalCrossThreadCalls = false;
    Je ne connaissais pas, tiens

    Bizarrement, cette propriété n'apparait pas chez moi dans l'IntelliSense (mais elle se compile, bien sur, quand je la tape à la mimine).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    Pour info, pour modifier des propriété de control ou de form depuis un autre thread, voilà le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void CodeThread(object arg1, ...)
    {
        if(this.InvokeRequired)
        {
            this.Invoke(new MethodInvoker(delegate { CodeThread(arg1, ...); }));
            return;
        }
        ModifyControlProperty();
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    Dans cette boucle, j'appelle une fonction delegate (anciennement callback) qui se situe dans ma classe principale (celle de la form). Et ca ne fonctionne pas... quoique je fasse visual me dit que je ne peux pas modifier un control depuis une fonction appelée par un thread différent
    Attention, j'ai l'impression que tu confond class et Thread, ce n'est pas parceque ton delegué est déclarer dans le code de ta form que le fait de passer par lui te permettra de faire des opérations inter-threads

  8. #8
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Non, je ne confonds pas classe et thread: j'ai bien compris le principe ne t'inquiètes pas

    J'ai trouvé comment faire . Il faut créer une fonction dans le code du thread principal qui s'occupe de resynchroniser les threads ensemble et qui appelle une deuxième fonction, elle aussi présente dans le code principale, qui s'occupe d'afficher les données !

    Merci beaucoup à tous!

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Tu as un problème de logique aussi. Ton système de log est conçu à l'envers. La partie qui gère les messages doit être complètement indépendante de la partie affichage de ces messages.

    Tu peux aussi utiliser ce qui existe déjà en matière de log dans le framework : Trace.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Tu peux aussi utiliser ce qui existe déjà en matière de log dans le framework : Trace.
    Tu peux m'en dire un peu plus? Je n'affiche pas toutes mes infos dans le même composant ...

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu peux quand même utiliser Trace, mais en implémentant des TraceListener "intelligents". Par exemple, si tu veux écrire certaines données dans une TextBox et d'autres dans la console, tu implémentes:
    - un TraceListener qui écrit dans la TextBox si le message commence par un préfixe spécifique (par exemple "[textbox]"), éventuellement en supprimant le préfixe au passage
    - un 2eme TraceListener qui écrit dans la console si le message commence par un autre préfixe (par exemple "[console]")
    Ensuite tu rajoutes ces listeners à la Trace (Trace.Listeners.Add)

    Sinon tu peux faire le "split" des messages dans un seul listener, c'est un peu moins élégant comme solution mais plus vite fait...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Threads et synchronisation
    Par divxdede dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 25/09/2007, 14h26
  2. Thread et synchronisation
    Par Invité dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 15/03/2007, 11h17
  3. créer Thread et synchronisation C et VB
    Par storm_2000 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 20/01/2007, 12h49
  4. [THREAD] Problème synchronisation
    Par goddet dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/10/2006, 09h16
  5. [JNI] Class Thread et Synchronisation
    Par SteelBox dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/02/2006, 23h40

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