1. #1
    Membre à l'essai
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    juillet 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : juillet 2016
    Messages : 17
    Points : 16
    Points
    16

    Par défaut [Débutant] Visual studio 2013. Plantage tâche parallèle

    Bonjour,
    Je suis actuellement en train de développer une application en VB relier à un serveur SQL local (pour l'instant).
    Pour optimiser le démarrage de l'appli je créer une tâche parallèle pour charger les données dans la datatable. Jusque là pas de soucis.
    Par la suite j'ai voulu créer une textbox pour en en faire une sorte de console informant l'utilisateur de ce qui se passe. C'est là ou ça ce complique, l'application plante à chaque fois que je veux remplir ma textbox.

    voici le morceau de code que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub W_Shown(sender As Object, e As EventArgs) Handles Me.Shown
     
            Dim LoadSql As New Task(Sub() SQL_LOAD(MSGAVT))
            'Charge les données dans la table 'EntManager_BaseProdDataSet._BaseProd_'             
            LoadSql.Start()
     
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        '----------------------------------------------------------------------------------------------------
        'CHARGEMENT BASE DE DONNEES
        '----------------------------------------------------------------------------------------------------
        Sub SQL_LOAD(Text As TextBox)
     
            Text.Text = "Console >_ Chargement de la base de donnée"
            Me.BaseProd_TableAdapter.Fill(Me.EntManager_BaseProdDataSet._BaseProd_)
            Text.Text = "Console >_ Base de données chargé"
            Threading.Thread.Sleep(2000)
            Text.Text = "Console >_ "
     
        End Sub
    J'ai fait plusieurs recherche sans beaucoup de succès je n'arrive pas à localiser mon problème. J'ai trouvé sur msdn pas mal de sujet qui mon le plus souvent perdu, dont le suivant ou je ne vois pas la différence entre les deux code qu'ils présentent :

    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
    ' This event handler creates a thread that calls a 
       ' Windows Forms control in an unsafe way.
        Private Sub setTextUnsafeBtn_Click( ByVal sender As Object, ByVal e As EventArgs) Handles setTextUnsafeBtn.Click
     
            Me.demoThread = New Thread( New ThreadStart(AddressOf Me.ThreadProcUnsafe))
     
            Me.demoThread.Start()
        End Sub
     
     
       ' This method is executed on the worker thread and makes
       ' an unsafe call on the TextBox control.
       Private Sub ThreadProcUnsafe()
          Me.textBox1.Text = "This text was set unsafely."
       End Sub
    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
    ' This event handler creates a thread that calls a 
       ' Windows Forms control in a thread-safe way.
        Private Sub setTextSafeBtn_Click( ByVal sender As Object, ByVal e As EventArgs) Handles setTextSafeBtn.Click
     
            Me.demoThread = New Thread( New ThreadStart(AddressOf Me.ThreadProcSafe))
     
            Me.demoThread.Start()
        End Sub
     
     
       ' This method is executed on the worker thread and makes
       ' a thread-safe call on the TextBox control.
       Private Sub ThreadProcSafe()
          Me.SetText("This text was set safely.")
        End Sub
    Une idée ?

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    avril 2007
    Messages
    13 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : avril 2007
    Messages : 13 115
    Points : 23 890
    Points
    23 890

    Par défaut

    il est interdit de modifier l'interface depuis un thread différent que le thread principal, sinon ca plante (cross thread exception)

    il y a des mécanismes permettant de s'en sortir
    depuis un thread différent on peut faire un invoke pour dire au thread principal d'exécuter un bout de code

    avec les tasks il y a async et await qui permettent de s'occuper de passer de l'un à l'autre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    juillet 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : juillet 2016
    Messages : 17
    Points : 16
    Points
    16

    Par défaut

    Merci Pol63 pour ton éclairage. Effectivement en continuant mes recherches j'ai finis par avoir les réponses à mes questions.

    N'ayant pas du tout l'habitude de travailler sur ce genre de système ça m'a un petit peu perturbé ce fonctionnement de tâche parallèle!

    Et pour ceux que ça intéresserait de voir la solution de code que j'ai mis en place pour résoudre ce conflit la voici :

    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
        Private Sub W_Shown(sender As Object, e As EventArgs) Handles Me.Shown
     
            Dim LoadSql As New Task(Sub() SQL_LOAD(TextBoxConsole))
            'Charge les données dans la table 'EntManager_BaseProdDataSet._BaseProd_'             
            TextBoxConsole.Text = "Console >_ Chargement de la base de donnée"
            LoadSql.Start()
     
        End Sub
     
        '----------------------------------------------------------------------------------------------------
        'CHARGEMENT BASE DE DONNEES
        '----------------------------------------------------------------------------------------------------
        Sub SQL_LOAD(Text As TextBox)
     
            Me.BaseProd_TableAdapter.Fill(Me.EntManager_BaseProdDataSet._BaseProd_)
            Me.FamilleTableAdapter.Fill(Me.EntManager_BaseProdDataSet2.Famille)
            Me.Taux_horairesTableAdapter.Fill(Me.EntManager_BaseProdDataSet1.Taux_horaires)
            Me.Console("Console >_ Base de données chargé")
            Threading.Thread.Sleep(2000)
            Me.Console("Console >_ ")
     
        End Sub
     
        Delegate Sub dConsole(MSG As String)
     
        Private Sub Console(MSG As String)
     
            If Me.TextBoxConsole.InvokeRequired Then
                Dim d As New dConsole(AddressOf Console)
                Me.Invoke(d, New Object() {MSG})
            Else
                Me.TextBoxConsole.Text = MSG
            End If
        End Sub

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

Discussions similaires

  1. Réponses: 89
    Dernier message: 19/01/2015, 09h58
  2. [Débutant] Probleme installation visual studio 2013
    Par stef_prog dans le forum Visual Studio
    Réponses: 1
    Dernier message: 05/10/2013, 20h39
  3. Microsoft présente Visual Studio 2013 et Team Foundation Server 2013
    Par Stéphane le calme dans le forum Autres Logiciels
    Réponses: 9
    Dernier message: 09/07/2013, 10h54
  4. Visual Studio 2013 : du côté C++
    Par Klaim dans le forum C++
    Réponses: 6
    Dernier message: 29/06/2013, 15h10
  5. Réponses: 15
    Dernier message: 14/03/2011, 10h05

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