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

Votre réponse

10 réponses

Meilleure réponse
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
- 19 mai 2016 à 16:53
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/

Merci vb95 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Messages postés
12240
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 19 mai 2016 à 19:23
Bonsoir
je plussoie
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
>
Messages postés
12240
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 19 mai 2016 à 20:55
Merci whis pour ton "plussoiement"
On invente des nouveaux mots
bonsoir à toi
Messages postés
12240
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
>
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
- 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
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
>
Messages postés
12240
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 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
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
- 20 mai 2016 à 08:46
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
- 20 mai 2016 à 10:20
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..
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
- 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
Messages postés
16
Date d'inscription
mercredi 20 avril 2016
Dernière intervention
5 juillet 2016
>
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
- 5 juil. 2016 à 09:56
Je suis revenue sur le projet cette semaine.
Ça marche très bien! un grand merci! :-)
Messages postés
1701
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
15 novembre 2018
- 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.