IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Arrêt d'un thread et réinitialisation Form1


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut 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....
    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

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 94
    Par défaut
    Here we are...

    Il fallait passer par un "delegate"

    Donc, la solution....
    Reprendre le code et rajouter le delegate "initialisation"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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 Delegate Sub initialisation()
        Private _continue As Boolean
    Appeler le "delegate", le code ci-dessous, donne l'exemple pour la gestion de l'erreur "timeout"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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()
                        If Me.InvokeRequired Then 'à rajouter
                            Me.Invoke(New initialisation(AddressOf _initialisation))'à rajouter
                        End If'à rajouter
                    End If
    Puis, l'initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub _initialisation()
            MsgBox("coucou", 64, "coucou")
            If _continue = False Then
                MsgBox("coucou1", 64, "coucou1")
                BT_Init.Enabled = True
            End If
        End Sub
    Oui, oui, oui les "coucou"s me servent....
    et je recharge la page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub BT_Init_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Init.Click
            Form1_Load(Me, New System.EventArgs)
        End Sub
    Voilou...

    Cordialement
    Lio

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème arrêt de certains thread dans une application
    Par adteulade dans le forum Android
    Réponses: 7
    Dernier message: 24/04/2012, 10h22
  2. arrêt aléatoire de thread
    Par khalfaoui.may dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 03/11/2011, 15h30
  3. [thread] Arrêt d'un thread en sommeil
    Par ChipsterJulien dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 06/06/2010, 16h04
  4. Erreur à l'arrêt d'un Thread
    Par David Fouejio dans le forum Windows Forms
    Réponses: 20
    Dernier message: 13/10/2007, 15h05
  5. [Thread] Réinitialiser un thread
    Par Pedro dans le forum Langage
    Réponses: 19
    Dernier message: 02/06/2005, 13h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo