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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 43
    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();
    }

+ 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