2017-10-11 4 views
1

Je suis un peu rouillé pour Visual Basic, mais je dois l'utiliser pour un projet sur lequel je travaille qui nécessite un langage .NET.Visual Basic Mise à jour de l'interface utilisateur graphique .text propriété sur le thread d'arrière-plan

j'ai remarqué lors de l'écriture un peu de code pour mettre à jour la valeur de texte d'une zone de texte dans une application fourm windows

'weve read the stuff...now lets update the textbox with the ADC value 
    DataQSingleDevice.GetInterleavedBinaryData(BinaryData, 0, 18) 



    DataQSingleDevice.Stop() 
    DATAQHandler(0).Disconnect() 




    'now lets throw data in the textbox 
    Button1.Text = "Connected!" 

    For incramenter As Integer = 0 To 10 
     TextBox1.Text = BinaryData(incramenter) 
     Threading.Thread.Sleep(2000) 
    Next 
    end sub 

que quand je passe par cette boucle au-dessus de moi, il ne met pas à jour le texte valeur à chaque itération. Je suppose que cela signifie qu'il ne peut le faire qu'après que la méthode que ce sous est dans a fini. Je me souviens de la programmation Android en Java que les modifications de propriétés comme celle-ci sont généralement implémentées sur le thread d'interface principal enfoui dans une boucle infinie que seul GOD lui-même et l'inventeur du langage java pourraient espérer trouver. Je me souviens aussi que des méthodes comme AsyncTask <> et Java.util.concurrent m'ont permis de faire des choses sur un thread d'arrière-plan et de mettre à jour certaines vues.

My question:

Est-il possible de mettre à jour la propriété des choses dans Visualbasic sur une interface graphique telle que « TextBox1.Text » semblable à la façon dont certaines vues dans la programmation Android peuvent être mis à jour périodiquement avec des fils de fond? (Ce processus peut durer quelques minutes de mise à jour ... cet exemple ne dure que 20 secondes mais mon utilisation pratique peut durer 10 minutes)

+2

Si cela est exécuté dans un thread d'arrière-plan, vous devrez appeler BeginInvoke pour forcer la mise à jour à se produire sur le thread d'interface utilisateur. – dwilliss

Répondre

0

En fait, il existe un moyen approprié d'accéder à l'interface utilisateur à partir d'un autre thread. Vous devriez faire ceci:

TextBox1.Invoke(Sub() TextBox1.Text = BinaryData(incramenter)) 

ou

TextBox1.BeginInvoke(Sub() TextBox1.Text = BinaryData(incramenter)) 

Au lieu de cela:

TextBox1.TextBox1.Text = BinaryData(incramenter) 

La différence entre .Invoke et .BeginInvoke est que le premier sera exécuté de manière synchrone, c'est le courant thread attendra l'action à l'intérieur du sous-marin lambda pour être entièrement effectué dans le thread UI, et seulement ensuite continuera. Ce dernier enverra le sous-élément lambda à exécuter dans le thread UI sans attendre qu'il s'exécute, de sorte que le thread appelant continue immédiatement. C'est à vous de choisir celui qui vous convient le mieux.

+0

Je vais faire un fil de fond et prendre un malin plaisir à essayer ça! –