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

VB.NET Discussion :

Thread safe et helper


Sujet :

VB.NET

  1. #1
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut Thread safe et helper
    Bonjour,
    Comme beaucoup je suis confronté au problème de la mise à jour de l'UI depuis un thread. J'utilise actuellement des délégués qui sont Invoke sur une form.
    Mais au fil du développement je me retrouve avec des délégués un peu partout, le code devient sale ....
    J'ai donc pensé créer un Module qui me permettrait de mettre à jour l'UI plus simplement.

    Par exemple une fonction qui prend en paramètre l'objet, le nom du champ à éditer et la valeur. Ensuite à l'aide du TypeDescriptor et d'un délégué on modifie la propriété.

    Je voulais savoir si vous connaissiez des méthodes plus adaptées pour simplifier ce genre d'actions. Comment faites vous, vous ?

    Merci

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    thread safe n'a rien à voir avec l'ui

    on qualifie de thread safe un membre qui peut etre appelé depuis plusieurs threads en même temps
    ou une classe dont tous les membres peuvent être appelé simultanément sans poser de problème
    par exemple le List(Of ) n'est pas thread safe, si un thread fait un for each dessus et qu'un autre thread fait .add ca plante
    il existe donc des mécanismes pour faire du thread safe à base de verrous (on peut se coder un List thread safe si nécessaire)

    et donc ici le problème c'est du cross thread, l'ui ne pouvant être modifiée que depuis le thread principal
    pour ca il y a plein de techniques, selon la taille du projet et le code en général

    avec un helper on pourrait en effet imaginer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public shared sub SetUiValue(c as control, propertyName as string, value as object)
        c.gettype.getproperty(propertyName, public or instance).setvalue(c,value,nothing)
    end sub

    avec un peu de lambda expression on peut imaginer des choses plus performantes, car la reflection à forte dose c'est couteux
    enfin si c'est un controle de temps en temps ca ne se verra pas non plus

    sinon les délégués ce n'est plus trop utilisé, les méthodes anonymes sont pratiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'pendant un thread
    c.invoke(new action(sub()
                                    c.text = telleVariable 
                                end sub))
    et sur le fx 4.5 il y aurait encore mieux (pas encore testé) await et autres qui permettent de mixer le code d'un thread avec le code appelant sans se poser de questions
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut
    Merci,
    J'avais confondu les deux en effet.
    Pour les performances, les contrôles sont rafraichis plusieurs fois par secondes parfois. Mais vu que j'ai besoin de beaucoup de maniabilité (j'ai pas que une propriete à modifier) je vais tenter en espérant que ça aura pas trop d'impact :/

  4. #4
    Membre du Club Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 56
    Points
    56
    Par défaut
    Voici ce que j'ai fait pour résoudre le problème pour ceux que ça intéresse, si vous avez des idées d'amélioration n'hésitez pas :
    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
    Imports System.Windows.Forms
    Imports System.ComponentModel
     
    Public Module ThreadHelper
        Public Sub EditProperty(obj As Object, propertyName As String, value As Object)
            If Application.OpenForms.Count > 0 Then
                Application.OpenForms(0).BeginInvoke(Sub() TypeDescriptor.GetProperties(obj.GetType)(propertyName).SetValue(obj, value))
            Else
                TypeDescriptor.GetProperties(obj.GetType)(propertyName).SetValue(obj, value)
            End If
        End Sub
        Public Sub BeginInvokeUiThread(method As Action)
            If Application.OpenForms.Count > 0 Then
                Application.OpenForms(0).BeginInvoke(method)
            Else
                method()
            End If
        End Sub
    End Module

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

Discussions similaires

  1. [RCP] Treeviewer non thread-safe ?
    Par Guildux dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 09/01/2007, 13h00
  2. fonction de stdio.h thread safe ??
    Par boolzor dans le forum POSIX
    Réponses: 3
    Dernier message: 30/04/2006, 20h03
  3. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  4. [Language]Immutable & Thread-Safe
    Par Repti dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/12/2005, 15h50
  5. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21

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