BackGroundWorker, récupérer et modifier contrôles textbox, combobox

Résolu
nicoadlc Messages postés 3 Date d'inscription mardi 6 février 2007 Statut Membre Dernière intervention 4 mai 2007 - 2 mai 2007 à 12:28
nicoadlc Messages postés 3 Date d'inscription mardi 6 février 2007 Statut Membre Dernière intervention 4 mai 2007 - 4 mai 2007 à 07:45
Bonjour à tous,

j'ai programmé il y quelques années en VB6, mais le passage  en VB.net n'est pas aisée...
J'ai créé une application windows qui selon la valeur d'un combobox, récupère des octets d'un port série, et les affiche dans une textbox

Cela fonctionne, mais je voulais le faire en boucle , en tâche de fond, pour ne pas mobiliser l'appli.
J'ai essayé avec le backgroudworker, mais il me met un  message d'erreur me signifiat que la modification d'un contrôle ne peut-être  effectué que dans le thred qui a crée ce contrôle.

J'ai donc regardé un peu de plus près ce backgroungworker, mais mes connaissances sont trop légères... On me parles de délégués, the thread, etc.... je suis paumé!

L'idée:

Une boucle
   * lire combobox
   * l'envoyer sur le port série
   * attendre la réponse et récupérer les octets
   * les aficher dans le textbosx
fin de boucle

Merci pour votre aide,

Nico

4 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
2 mai 2007 à 18:56
Moi aussi j'ai eu quelques soucis, soit l'appli par en boucle infinie, soit je n'arrive pas à arreter le thread ou plus exactement la boucle.

Finalement je suis reparti sur un BackGroundWorker, que j'ai reussi à fiare marcher je pense.

Maintenant il faut voir si elle est fiable dans le temps

    Private Sub BtnDémarrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDémarrer.Click
        Me.BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BtnArrêter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnArrêter.Click
        Me.BackgroundWorker1.CancelAsync()
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Do
            Dim Del As New EchangeHandler(AddressOf ProcEchange)
            Me.Invoke(Del)
            Application.DoEvents()
        Loop Until Me.BackgroundWorker1.CancellationPending = True
    End Sub
    Private Sub ProcEchange()
        'On Recopie le contenu de txtbox1 dans textbox 2
        TextBox2.Text = TextBox1.Text
    End Sub

    Private Delegate Sub EchangeHandler()

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
2 mai 2007 à 13:32
Regarde ce topic sur une question presque similaire posée hier, peut-etre que ça te donnera des idées et une piste pour résoudre ton problème.

http://www.vbfrance.com/infomsg_THREAD-SAFE_933029.aspx#7

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #
0
nicoadlc Messages postés 3 Date d'inscription mardi 6 février 2007 Statut Membre Dernière intervention 4 mai 2007
2 mai 2007 à 15:26
Casy,

merci à toi.
En effet ce post m'est d'une grande aide.
Je l'ai testé avec un formulaire simple recopiant la valeur d'un textbox dans un autre textbox:
Deux boutons (1 marche 1 arrêt) deux textBox (Txt1 et txt2), et celà fonctionne. Le thread est bien effectué une fois et la valeur de txt1 est bien recopié dans le txt2, mais dès que j'insère une boucle sans fin do loop, dans la procédure échange, l'appli ne répond plus dès le démarrage.
Je ne sais pas où placer ce "do loop" sans que l'appli ne plante.

Voici le code de cette source:

Imports

System.Threading
Public

Class Form2

Dim Tache
As Thread

Private
Sub BtnDémarrer_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles BtnDémarrer.ClickBtnDémarrer.Enabled False : BtnArrêter.Enabled
True
Tache =
New Thread(
New ThreadStart(
AddressOf Echange))
Tache.Start()

End
Sub

Private
Sub BtnArrêter_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs) Handles BtnArrêter.ClickBtnDémarrer.Enabled True : BtnArrêter.Enabled
False
Tache.Abort()

End
Sub

Private
Sub ProcEchange()

'On Recopie le contenu de txtbox1 dans textbox 2
TextBox2.Text = TextBox1.Text

End
Sub

Private
Sub Echange()

Dim Del
As
New EchangeHandler(
AddressOf ProcEchange)

Me.BeginInvoke(Del)

End
Sub

Private
Delegate
Sub EchangeHandler()
End

Class

merci pour votre aide

nico
0
nicoadlc Messages postés 3 Date d'inscription mardi 6 février 2007 Statut Membre Dernière intervention 4 mai 2007
4 mai 2007 à 07:45
Merci Casy

Le problème a été résolu. Je ne pensais pas qu'il fallait absolument un DoEvents().

A+

Nico
0
Rejoignez-nous