Problème : perte de la main sur l'application : interface bloqué

Résolu
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016 - Modifié par KelaireM le 19/05/2016 à 15:54
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016 - 5 juil. 2016 à 09:56
Bonjour à tous!

Je suis face au problème suivant : j'envoie et je reçois des données par un port série. Les données envoyées sont tirées d'un fichier .HEX. Il nécessite un certain traitement.

Lors de l'appel d'un sub, qui est relié à une barre de progression, je perd la main sur l'application : impossible de bouger la fenêtre, la barre de progression a du mal à se mettre à jour, son effet visuel de scintillement n'est plus là..
Je pense que c'est à cause des évènements : lorsque je rajoute des "Application.DoEvents", le scintillement revient par moment, il en est de même pour la main : je peux déplacer la fenêtre, la réduire, ...

Voici le code qui pose problème :


WriteRS232(Str_tbl(0), CInt(Str_tbl(0).Length / 2))

'Wait for "0xAA" simple boucle while avec rien dedans
Wait4Resp1(Str_AA)
' progression ++
pg.PerformStep()

For i = 1 To 3
WriteRS232(Str_tbl(i), CInt(Str_tbl(i).Length / 2))
Next

pg.PerformStep()
'Wait for CheckSum
Wait4Resp3(Str_ChkSum)

pg.PerformStep()

WriteRS232(Str_tbl(4), CInt(Str_tbl(4).Length / 2))

pg.PerformStep()

'Wait for "0xAA"
Wait4Resp1(Str_AA)

pg.PerformStep()

WriteRS232(Str_tbl(5), CInt(Str_tbl(5).Length / 2))
WriteRS232(Str_tbl(6), CInt(Str_tbl(6).Length / 2))

pg.PerformStep()

Wait4Resp18(Str_RpCarte)

pg.PerformStep()


Tous les wait4 sont des boucles while avec strictement rien à l'intérieur.
WriteRS232 permet d'envoyer des données hexa via le port rs-232.
Ces deux fonctions sont utilisés à d'autre moment et ne supprime pas la main sur l'application..
J'ai une fonction qui permet de lire en continue sur le port série : "duff = duff & CStr(SPort1.ReadExisting)" où duff est une variable globale que je viens regarder lors de l'appel de "wait4". (il semble que ce ne soit pas "Thread-safe", mais je n'ai pas compris ce que ça implique.)

il y a encode du code pour la partie d'initialisation, mais il est long, je le mettrais si vous demandez! (Il existe une balise pour cacher? div et spoiler ne marchent pas!)

Merci d'avance :-)

3 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
19 mai 2016 à 16:53
Bonjour
Je serais toi je mettrais ma Sub en tâche de fonds avec un BackGroundWorker
ton projet s'exécute dans un Thread et ta sub s'exécuterait dans un autre !thread ce qui éviterait le blocage de ton interface
Les
Application.Doevents()
semblent un peu corriger le problème car ils obligent le code à retourner dans le système ( donc au niveau de ton interface ) pour rafraichir le système et donc ton projet par la même occasion

Pour le BackGoundWorker voir http://plasserre.developpez.com/cours/vb-net/

1
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
19 mai 2016 à 19:23
Bonsoir
je plussoie
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024
19 mai 2016 à 20:55
Merci whis pour ton "plussoiement"
On invente des nouveaux mots
bonsoir à toi
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
19 mai 2016 à 21:15
Oh c'est pas si nouveau que ça!
Depuis la Zénitude, c'est fou le nombre de néologisme qui ont fleuri
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024
19 mai 2016 à 21:55
pour le verbe plussoyer ok c'est pas nouveau mais moi j'ai inventé peut-être le "plussoiement"
D'ailleurs il est souligné en rouge comme quoi j'avais fait une faute d'orthographe ou de frappe
bon Weekend à toi
0
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016
20 mai 2016 à 08:46
Bonjour, merci de vos réponses!

Je ne suis pas extrêmement douée avec le BackGroundWorker, pour l'instant ça me fait des erreurs, je m'y remet ce matin en espérant être plus fraîche et je tiens au jus! :-)
0
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016
20 mai 2016 à 10:20
Rebonjour!

J'ai fais certains tests. Il semblerait que cela ne vienne pas du thread de lecture, mais de l'écriture sur le port..
En effet, cela bloque lorsque je convertie un bloc de 2Ko d'hexa en byte et que je l'envoie..

Pourtant le code est simple.. :
    Private Sub WriteRS232(Data As String, nbData As Integer)

Dim Buffer() As Byte
Dim i As Integer
Dim ChkSum As Integer
Dim EntChkSum As Integer
Dim RstChkSum As Integer
Dim StrEntChkSum As String
Dim StrRstChkSum As String

'Buffer of 2KB
ReDim Buffer(0 To 2047)

For i = 0 To Data.Length - 1 Step 2
'Conversion in byte
Buffer(i \ 2) = Convert.ToByte(Data.Substring(i, 2), 16)
Next

'Verify CheckSum
For i = 0 To (nbData - 1)
ChkSum += Buffer(i)
Next

RstChkSum = ChkSum Mod 256
StrRstChkSum = Hex(RstChkSum)
If StrRstChkSum.Length = 1 Then
StrRstChkSum = "0" & StrRstChkSum
End If

RstChkSum = Convert.ToInt32(StrRstChkSum, 16)

EntChkSum = ChkSum \ 256
StrEntChkSum = Hex(EntChkSum)
If StrEntChkSum.Length < 2 Then
StrEntChkSum = "0" & StrEntChkSum
Else
StrEntChkSum = StrEntChkSum.Substring(StrEntChkSum.Length - 2, 2)
End If

EntChkSum = Convert.ToInt32(StrEntChkSum, 16)

Str_ChkSum = Chr(RstChkSum) & "" & Chr(EntChkSum)

'Send the data
SPort1.Write(Buffer, 0, nbData)

End Sub


C'est peut être à cause de la longueur ? 2Ko..
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 20/05/2016 à 12:43
Bonjour
Mais WriteRS232 est bien une sub qui est contenue dans la sub qui te bloque ! Et c'est la sub qui te bloque qu'il faut mettre en BackGround !
De plus lorsque Windows écrit sur un port RS232 il n'écrit pas forcement tout le tableau d'un seul coup mais cela on n'y peut rien
0
KelaireM Messages postés 16 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 5 juillet 2016 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
5 juil. 2016 à 09:56
Je suis revenue sur le projet cette semaine.
Ça marche très bien! un grand merci! :-)
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
20 mai 2016 à 23:30
Bonsoir
Pour les Threads et BackGroundWorker c'est ici : http://plasserre.developpez.com/cours/vb-net/?page=windows-forms5#LX-R
0
Rejoignez-nous