Arrêt d'un thread et réinitialisation Form1
Bonsoir à tous,
1. Quelques explications avant d'exposer mon soucis!
Je lis des données sur le port série qui sont placées dans un tableau, puis effectue quelques traitements avec ce tableau (recherche des données, etc...)
Tout cela fonctionne...
Je me lance donc dans la gestion des erreurs et imagine plusieurs cas de figure :
- toutes les données n'ont pas été correctement transmises
- les données qui arrivent sur le port ne correspondent pas à ce que le programme attend
- aucune donnée, car l'interface, connecté au port, n'a pas été alimentée....:oops:
La gestion des erreurs passe par un try / catch. Afin de tester si chaque type d'erreur est bien pris en compte, je place une msgbox
Cela fonctionne
2. Ce que je souhaite
Lorsque la msgbox a été validée suite à une erreur, je souhaite qu'un bouton nommé "Initialisation" passe à "true" afin de relancer la lecture du port après avoir fixé le problème côté interface (rebrancher l'alim, rectifier le prog du µC, etc...)
Bien entendu cela sous entend que la configuration du port soit correct...
J'espère vous avoir donné toutes les informations...
Code avec lequel tout s'arrête et plus rien ne se passe, pas d'erreur, ma form reste affichée, MAIS je peux la quitter correctement....
donc msgbox "erreur" s'affiche, puis msgbox "coucou", puis msgbox "coucou1", puis plus rien...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
Imports System.IO.Ports
Imports System.Threading
Public Class Form1
Dim resultat1 As String
Dim resultat2 As String
Dim resultat3 As String
Private Delegate Sub box1(ByVal resultat1 As String)
Private Delegate Sub box2(ByVal resultat2 As String)
Private Delegate Sub box3(ByVal resultat3 As String)
Private _continue As Boolean
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
BT_Init.Enabled = False
With SerialPort1
.PortName = "COM3"
.BaudRate = 9600
.Parity = IO.Ports.Parity.None
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
End With
Dim readThread As Thread = New Thread(AddressOf Read)
SerialPort1.ReadTimeout = 1000
SerialPort1.Open()
_continue = True
readThread.Start()
If _continue = False Then
MsgBox("coucou2", 64, "coucou2")
End If
End Sub
Public Sub Read()
While (_continue)
Try
System.Threading.Thread.Sleep(300)
Dim octet_recu As Byte = 9 'SerialPort1.ReadByte
Dim tab(octet_recu - 1) As Byte ' Tableau acceuillant les données au format byte
SerialPort1.Read(tab, 0, octet_recu) 'lecture du port
'traitement du tableau de données
Catch ex As IndexOutOfRangeException
MsgBox("Les mesures transmises par l'interface ne sont pas correctes", 64, "Données incorrectes")
_continue = False
SerialPort1.Close()
Catch ex As TimeoutException
MsgBox("Aucunes données ne sont transmises", 64, "Erreur")
resultat1 = "aucune mesure"
resultat2 = "Aucune mesure"
resultat3 = "Aucune mesure"
If MsgBoxResult.Ok Then
_continue = False
SerialPort1.Close()
Call initialisation()
End If
Catch ex As ThreadAbortException
_continue = False
SerialPort1.Close()
Catch e As InvalidOperationException
SerialPort1.Close()
_continue = False
System.Threading.Thread.CurrentThread.Abort()
Me.Close()
End Try
If Me.InvokeRequired Then
Me.Invoke(New box3(AddressOf _box2), resultat3)
Me.Invoke(New box2(AddressOf _box3), resultat2)
Me.Invoke(New box1(AddressOf _box1), resultat1)
Else : _continue = False
SerialPort1.Close()
End If
End While
End Sub
Public Sub initialisation()
MsgBox("coucou", 64, "coucou")
If _continue = False Then
MsgBox("coucou1", 64, "coucou1")
System.Threading.Thread.CurrentThread.Abort()
BT_Init.Enabled = True
End If
End Sub
Private Sub FrmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Dim msgbox_ferm As DialogResult
msgbox_ferm = MessageBox.Show("Souhaitez-vous quitter cette apllication?", "Quitter", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If msgbox_ferm = Windows.Forms.DialogResult.No Then
e.Cancel = True
End If
If msgbox_ferm = Windows.Forms.DialogResult.Yes Then
SerialPort1.Close()
_continue = False
System.Threading.Thread.CurrentThread.Abort()
Exit Sub
End If
End Sub
Private Sub _box2(ByVal resultat2 As String)
TextBox2.Text = resultat2
End Sub
Private Sub _box3(ByVal resultat3 As String)
TextBox3.Text = resultat3
End Sub
Private Sub _box1(ByVal resultat1 As String)
TextBox1.Text = resultat1
End Sub
End Class |
si je supprime "System.Threading.Thread.CurrentThread.Abort()" dans la procédure "Initialisation", là j'ai une erreur :
à la ligne "BT_Init.Enable=true"
qui dit :
Citation:
L'exception InvalidOperationException n'a pas été gérée
Opération inter-threads non valide : le contrôle 'BT_Init' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
Code:
1 2 3 4 5 6 7 8 9 10
| Public Sub initialisation()
MsgBox("coucou", 64, "coucou")
If _continue = False Then
MsgBox("coucou1", 64, "coucou1")
'System.Threading.Thread.CurrentThread.Abort()'Suppression de l'arrêt du thread
BT_Init.Enabled = True 'l'erreur est ICI
End If
End Sub |
Il faudrait pouvoir :
- arrêter et sortie du "thread"
- réinitialiser la "Form1_load"
- rendre le bouton Initialisation Valide afin de relancer le thread de lecture
Comprenez vous mon soucis?
J'ai bien lu qu'il n'était pas conseillé d'utiliser ".Abort" pour un thread, mais plutôt ".join". Mais dans ce cas, je pense qu'il est utile d'arrêter le thread car de toute manière il y a une erreur, non? J'ai essayé ".join", rien ne se produit....
Merci
Cordialement
Lio