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

Mono .NET Discussion :

[Mono] Problème de delegate


Sujet :

Mono .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Points : 57
    Points
    57
    Par défaut [Mono] Problème de delegate
    Bonjour à tous,

    J'ai un soucis avec mon interface graphique (Gtk#) et un thread qui doit mettre à jour des labels.
    Pour simplifier : j'ai un thread qui se charge de gérer une liaison série lorsque que l'utilisateur appuie sur un Gtk.Buton, ainsi que de mettre à jour un label pour renseigner l'état de la liaison série.
    Voici mon code (version simplifié):
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    t = new System.Threading.Thread(new ThreadStart(thread_Process));
     
    private void Buton_Clik(object sender, System.EventArgs e)
    { 
            t.Start();
    }
     
     
    private void thread_Process()
    {
           OpenSerialPort();
           Gtk.Application.Invoke(delegate
                                           {
                                                   myLabel.Text = "Port série ouvert";
                                           });
            string[] rxdata = new string[];
            rxdata = ReadData();
            Gtk.Application.Invoke(delegate
                                           {
                                                   myLabel.Text = "Data lues";
                                                   labelVal1.Text = rxdata[0];
                                                   labelVal2.Text = rxdata[1];
                                           });
            CloseSerialPort();
            Gtk.Application.Invoke(delegate
                                           {
                                                   myLabel.Text = "Port série fermé";
                                           });
    }
    Le problème est que les labels ne se mettent pas à jour tout le temps.
    De plus l'éxécution du code est assez bizard : le port série est fermé avant même que les labels LabelVal1 et LabelVal2 soient mis à jour (je croyais être en synchrone avec Invoke()!). Et le temps de mise à jour de ces Labels (quand ils sont mis à jour bien sur!!!!! ) est trés long!
    Je ne comprends pas pourquoi...
    J'ai pourtant repris l'exemple de la mono doc
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Peut être tout simplement un bug dans le framework Mono.
    J'ai entendu dire qu'il y avait encore pas mal de problème avec tout ce qui est winform sous mono .
    Bref faire tourner des fenêtres Windows sous linux ce n'est pas encore parfait.
    Il semblerait que le pinguoin fait de la résistance .
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  3. #3
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Peut être tout simplement un bug dans le framework Mono.
    J'ai entendu dire qu'il y avait encore pas mal de problème avec tout ce qui est winform sous mono .
    Bref faire tourner des fenêtres Windows sous linux ce n'est pas encore parfait.
    Il semblerait que le pinguoin fait de la résistance .
    Avant de dire n'importe quoi il faut lire le code et prendre la peine de savoir si on sait de quoi on parle .

    Son exemple est en Gtk#, pas en Winform, et le support des winforms est très bon à l'heure actuelle ... Bref passe ton chemin avant de raconter des betises, merci.

    @goddet : L'utilisation d'Invoke ne peux pas être synchrone car tu exécute du code dans un autre thread . En effet lors de l'utilisation de invoke tu fait quoi ? :
    Tu demandes à ce que le code qui est dans le thread actuel soit exécuté dans le thread de l'application Gtk#. Or les deux thread sont différents. Le premier continu donc sa route alors que le thread Gtk# execute la MAJ.

    Pour la lenteur j'ai eu le même problème, il semblerait que :
    - Soit un event bloque le thread Gtk#
    - Soit c'est un bug dans l'implémentation Gtk#
    - Soit c'est autre chose

    Quelle version de Mono et de Gtk# utilises tu ?
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    support des winforms est très bon à l'heure actuelle
    Tous les développeurs sous mono ne sont pas de cet avis. Bon je doit admettre que je ne développe pas sous mono mais j'ai confiance en les personnes qui m'ont racontés leurs problèmes. Enfin faut avoués que cela date peut être de 3 mois mes infos.
    J'offrais une piste potentielle sur le problème.
    J'avais compris que Gtk# n'était pas du winform, je laissais sous entendre que si mono avait eu (ou a encore) des problèmes avec les winforms, peut être que c'est la même chose avec Gtk#. Parce que je ne connais pas Gtk# mais il doit bien utiliser les composants du framework, non ?
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  5. #5
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Enfin faut avoués que cela date peut être de 3 mois mes infos.
    3 mois c'est énorme dans le cycle de dev de Mono. Il y a 3 mois le support d'ASP.NET 2.0 n'était pas complet. Aujourd'hui c'est fait. Il y a 3 mois le support des controls 2.0 winform n'était pas complet, aujourd'hui quasiment.

    Citation Envoyé par ced600 Voir le message
    J'avais compris que Gtk# n'était pas du winform, je laissais sous entendre que si mono avait eu (ou a encore) des problèmes avec les winforms, peut être que c'est la même chose avec Gtk#. Parce que je ne connais pas Gtk# mais il doit bien utiliser les composants du framework, non ?
    Ben justement non .
    Les winforms, sous Mono, sont des compo complètement managé écrit pour la compatibilité des apps. C'est un framework entièrement écrit par l'équipe de Mono. GTK# n'est "que" le binding de GTK+ avec C#, comme tu GTK-PHP, GTK-Python et autre. Cela n'as donc RIEN à voir au niveau des composants graphiques. Seul le système d'event, les type primaires et le langage sont les même ...
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Ok je ne savais pas.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    En tout cas merci quand même pour ces réponses.
    Est-ce qu'il y a une autre solution que delegate?
    Je pensais, par exemple, créer un EventHandler un peu comme avec les boutons, mais comme je ne suis pas un pro je ne sais pas trop comment créer ça!
    Et puis surtout est-ce que ca va changer grand chose?

Discussions similaires

  1. Problème de delegate
    Par Mario Rousson dans le forum VB.NET
    Réponses: 6
    Dernier message: 23/07/2012, 01h47
  2. [Mono] Problème de localisation
    Par LudVichzme dans le forum Mono
    Réponses: 0
    Dernier message: 08/06/2009, 22h17
  3. [C#][Thread][Invoke] petit problème de delegate
    Par clinic dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 22/06/2007, 12h38
  4. Réponses: 1
    Dernier message: 24/11/2006, 17h36
  5. Problème de servlet mono-thread !
    Par solven dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 13/10/2006, 11h44

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