BackGroundWorker, récupérer et modifier contrôles textbox, combobox [Résolu]

nicoadlc 3 Messages postés mardi 6 février 2007Date d'inscription 4 mai 2007 Dernière intervention - 2 mai 2007 à 12:28 - Dernière réponse : nicoadlc 3 Messages postés mardi 6 février 2007Date d'inscription 4 mai 2007 Dernière intervention
- 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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 2 mai 2007 à 18:56
3
Merci
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 #

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de cs_casy
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 2 mai 2007 à 13:32
0
Merci
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 #
Commenter la réponse de cs_casy
nicoadlc 3 Messages postés mardi 6 février 2007Date d'inscription 4 mai 2007 Dernière intervention - 2 mai 2007 à 15:26
0
Merci
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
Commenter la réponse de nicoadlc
nicoadlc 3 Messages postés mardi 6 février 2007Date d'inscription 4 mai 2007 Dernière intervention - 4 mai 2007 à 07:45
0
Merci
Merci Casy

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

A+

Nico
Commenter la réponse de nicoadlc

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.