Problème : perte de la main sur l'application : interface bloqué [Résolu]

Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
-
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 :-)
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
1754
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 janvier 2019
59
1
Merci
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/

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 91 internautes nous ont dit merci ce mois-ci

Whismeril
Messages postés
12595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 janvier 2019
765 -
Bonsoir
je plussoie
vb95
Messages postés
1754
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 janvier 2019
59 > Whismeril
Messages postés
12595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 janvier 2019
-
Merci whis pour ton "plussoiement"
On invente des nouveaux mots
bonsoir à toi
Whismeril
Messages postés
12595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 janvier 2019
765 > vb95
Messages postés
1754
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 janvier 2019
-
Oh c'est pas si nouveau que ça!
Depuis la Zénitude, c'est fou le nombre de néologisme qui ont fleuri
vb95
Messages postés
1754
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 janvier 2019
59 > Whismeril
Messages postés
12595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 janvier 2019
-
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
Commenter la réponse de vb95
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
0
Merci
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! :-)
Commenter la réponse de KelaireM
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
0
Merci
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..
vb95
Messages postés
1754
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 janvier 2019
59 -
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
KelaireM
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
> vb95
Messages postés
1754
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 janvier 2019
-
Je suis revenue sur le projet cette semaine.
Ça marche très bien! un grand merci! :-)
vb95
Messages postés
1754
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 janvier 2019
59 -
Bonsoir
Pour les Threads et BackGroundWorker c'est ici : http://plasserre.developpez.com/cours/vb-net/?page=windows-forms5#LX-R
Commenter la réponse de KelaireM

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.