nicoadlc
Messages postés3Date d'inscriptionmardi 6 février 2007StatutMembreDernière intervention 4 mai 2007
-
2 mai 2007 à 12:28
nicoadlc
Messages postés3Date d'inscriptionmardi 6 février 2007StatutMembreDerniè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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
nicoadlc
Messages postés3Date d'inscriptionmardi 6 février 2007StatutMembreDerniè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)