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....
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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