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 :

textbox en thread


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Par défaut textbox en thread
    Salut,

    j'ai deux techniques qui fonctionnent, laquelle est la meilleure ?

    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
    Public Delegate Sub SetTextBoxDelegate(ByVal TB As TextBox, ByVal txt As String)
        Public Sub Textbox_safe(ByVal TB As TextBox, ByVal txt As String)
            If TB.InvokeRequired Then
                TB.Invoke(New SetTextBoxDelegate(AddressOf Textbox_safe), New Object() {TB, txt})
            Else
                TB.Text = txt
            End If
        End Sub
     
     
        Public Sub Texte_safe(box As TextBox, text As String)
            If box.InvokeRequired Then
                box.Invoke(Sub() box.Text = text)
            Else
                box.Text = text
            End If
        End Sub

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Ton code présente deux méthodes, mais la première appelle la seconde.
    Pour moi cela ne constitue qu'une seule et même technique.

    Mais si ton dilemme consiste à savoir si tu dois passer par ByVal ou non, alors il faut s'intéresser aux subtilités du passage d'arguèrents avec ByVal.

    TextBox étant un type "référence", le passage par ByVal implique qu'au lieu de passer l'objet lui même, tu passe le pointeur vers cette objet.
    String étant un type "valeur", le passage par ByVal implique que tu ne peux pas modifier cette valeur au sein de la procédure.

    Donc, pour moi, la meilleure solution est un mixte des deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub Texte_safe(box As TextBox, ByVal text As String)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Par défaut
    Merci pour ta réponse popo.

    Mais Byval est la valeur par défaut dans les méthodes donc ce n'est pas la peine…


    Mais ma question portait plus sur le invoke

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TB.Invoke(New SetTextBoxDelegate(AddressOf Textbox_safe), New Object() {TB, txt})
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      box.Invoke(Sub() box.Text = text)

    Le second code semble moins stable.
    Je vais prendre le premier comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Public Delegate Sub SetTextBoxDelegate(Box As TextBox, Txt As String)
     
        Public Sub TextBox_safe(Box As TextBox, Txt As String)
            If Box.InvokeRequired Then
                Box.Invoke(New SetTextBoxDelegate(AddressOf TextBox_safe), New Object() {Box, Txt})
            Else
                Box.Text = txt
            End If
        End Sub

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    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 198
    Par défaut
    moins stable ? c'est à dire ?
    la plus courte est en théorie à privilégier, surtout que déclarer un delegate sub c'était sympa en 2005 mais maintenant c'est plus lourd qu'autre chose ...
    niveau perf (si c'est ca la question) j'aurais tendance à dire peu importe si ca prend 1 ou 3 nanoseconde vu que ca n'est pas appelé 50x par seconde
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Par défaut
    avec cette version, j'avais des plantages lors des arrêts du soft.

    si cela peut aider quelqu'un, j'ai fait beaucoup de test, et voici le code final de mes box utilisable en thread pour éviter les "Opération inter-threads non valide" :


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Private Delegate Sub SetTextBoxDelegate(Box As System.Windows.Forms.TextBox, Txt As String)
     
        Public Sub TextBox_safe(Box As System.Windows.Forms.TextBox, Txt As String)
            If Box.InvokeRequired Then
                Box.Invoke(New SetTextBoxDelegate(AddressOf TextBox_safe), New Object() {Box, Txt})
            Else
                Box.Text = Txt
            End If
        End Sub
     
     
     
        Private Delegate Sub SetLabelBoxDelegate(Box As System.Windows.Forms.Label, Txt As String)
     
        Public Sub LabelBox_safe(Box As System.Windows.Forms.Label, Txt As String)
            If Box.InvokeRequired Then
                Box.Invoke(New SetLabelBoxDelegate(AddressOf LabelBox_safe), New Object() {Box, Txt})
            Else
                Box.Text = Txt
            End If
        End Sub
     
     
     
        Private Delegate Sub SetRichTextBoxDelegate(Box As System.Windows.Forms.RichTextBox, Txt As String)
     
        Public Sub RichTextBox_safe(Box As System.Windows.Forms.RichTextBox, Txt As String)
            If Box.InvokeRequired Then
                Box.Invoke(New SetRichTextBoxDelegate(AddressOf RichTextBox_safe), New Object() {Box, Txt})
            Else
                Box.Text = Txt
            End If
        End Sub
     
        Public Sub RichTextBox_safe_refresh(Box As RichTextBox)
            If Box.InvokeRequired Then
                Box.Invoke(New SetRichTextBoxDelegate(AddressOf RichTextBox_safe), New Object() {Box})
            Else
                ' Box.Refresh()
                Box.Update()
            End If
        End Sub

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    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 198
    Par défaut
    en même temps si les gens cherchent autant que toi ils ne tomberont pas ici
    ce code existe en dizaines de milliers d'exemplaires sur internet depuis 2005 ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. Thread et TextBox
    Par archer dans le forum C#
    Réponses: 8
    Dernier message: 20/05/2008, 00h14
  2. Réponses: 5
    Dernier message: 19/05/2008, 10h31
  3. Controler des textBox dans des thread
    Par ramaro dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/04/2008, 14h21
  4. Textbox et Thread
    Par migutz dans le forum VB.NET
    Réponses: 1
    Dernier message: 22/04/2008, 12h46
  5. [vc++ 2005] acceder a un textbox a partir d un thread
    Par jerome86600 dans le forum VC++ .NET
    Réponses: 9
    Dernier message: 12/07/2006, 13h10

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