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

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

10 réponses

Répondre au sujet
vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 19 mai 2016 à 16:53
+1
Utile
4
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/

Cette réponse vous a-t-elle aidé ?  
Whismeril 11406 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 19 mai 2016 à 19:23
Bonsoir
je plussoie
vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention > Whismeril 11406 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 19 mai 2016 à 20:55
Merci whis pour ton "plussoiement"
On invente des nouveaux mots
bonsoir à toi
Whismeril 11406 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention > vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 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
vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention > Whismeril 11406 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 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
Commenter la réponse de vb95
KelaireM 16 Messages postés mercredi 20 avril 2016Date d'inscription 5 juillet 2016 Dernière intervention - 20 mai 2016 à 08:46
0
Utile
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
KelaireM 16 Messages postés mercredi 20 avril 2016Date d'inscription 5 juillet 2016 Dernière intervention - 20 mai 2016 à 10:20
0
Utile
3
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 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 20 mai 2016 à 12:41
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 16 Messages postés mercredi 20 avril 2016Date d'inscription 5 juillet 2016 Dernière intervention > vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 5 juil. 2016 à 09:56
Je suis revenue sur le projet cette semaine.
Ça marche très bien! un grand merci! :-)
vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 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
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.