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 :

Aide sur Multi-Threading


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Par défaut Aide sur Multi-Threading
    Bonjour,

    Je viens chercher un peu d'aide, car je ne trouve pas de solution à mon problème. J'espère que vous pourrez m'aider

    Alors voilà, j'utilise du code qui me permet de récupérer un fichier (openfiledialog), et ensuite je copie ce dernier vers une destination. Le fichier peut faire quelques Ko comme quelques Go. Donc, pendant cette copie, l'appli se freeze, normal.

    Le problème se trouve au niveau d'un form que je souhaite afficher, avec une animation, le temps que le fichier se copie.

    Cependant, je ne trouve pas de solution car un backgroundworker s'exécute et se stop, et je n'ai pas trouvé de moyen pour lui dire d'attendre que la copie soit terminée. J'ai cherché sur internet, et j'ai trouvé sur msdn un bout de code permettant de créer un thread séparé, mais là, c'est la galère car je ne sais pas m'en servir, et je ne trouve pas d'explications

    J'ai du coup essayé de mettre mon code de copie de fichier dans le backgroundworker, au lieu d'y mettre le form pour patienter ... et là, c'est le drame également car j'ai des erreurs lorsque je tente d'accéder à des textbox ou autre de mon thread principal, et idem, j'ai beau chercher, je ne parviens pas à les résoudre. Une histoire de SingleThreadApartment, un truc du genre ...

    Bref voici le code actuel :

    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
     Private Sub pic_add_MouseUp(sender As Object, e As MouseEventArgs) Handles pic_add.MouseUp
     
            'Lorsque l'on relâche le clic sur le bouton
            pic_add.Image = My.Resources.Add_norm
            My.Computer.Audio.Play(My.Resources.sound_clic, AudioPlayMode.Background)
     
            'On ouvre la openfiles dialogbox si une console est sélectionnée
            If cmb_console.SelectedIndex <> -1 Then
     
                Using _ofd As New OpenFileDialog
                    With _ofd
                        .CheckFileExists = True
                        .CheckPathExists = True
                        .InitialDirectory = "C:\"
                        .Multiselect = True
                        .RestoreDirectory = True
                        If cmb_console.SelectedIndex = 0 Then
                            .DefaultExt = ".a78"
                            .Filter = "Fichier Rom ATARI 7800 (*.a78)|*.a78"
                            .Title = "Ajouter une Rom pour ATARI 7800"
                            cheminconsole = chemin + "\ROMS\ATARI7800\"
     
                            (...)
     
                        End If
     
                        If .ShowDialog() = DialogResult.OK Then
     
                            'On affiche la fenêtre patienter
                            Patienter.Show()
     
                            'On lit les fichiers
                            Dim fichier As String
     
                            For Each fichier In .FileNames
                                'On ajoute les fichiers au répertoire de roms de la console choisie
                                Try
     
                                    File.Copy(fichier, cheminconsole & System.IO.Path.GetFileName(fichier), True)
     
                                    lst_roms.Items.Clear()
     
                                    Dim files = My.Computer.FileSystem.GetFiles(cheminconsole, FileIO.SearchOption.SearchAllSubDirectories, "*.*")
     
                                    For Each rom As String In files
                                        resultat = IO.Path.GetFileName(rom)
                                        lst_roms.Items.Add(resultat)
                                    Next
     
                                Catch ex As Exception
     
                                    ' On gère un éventuel problème
                                    MessageBox.Show("Une erreur est survenue lors de l'ajout. Le message est :" & vbCrLf & vbCrLf & ex.Message)
     
                                End Try
     
                            Next fichier
     
                        End If
     
                    End With
     
                End Using
     
                Patienter.Close()
     
     
            ElseIf cmb_console.SelectedIndex = -1 Then
                MsgBox("Veuillez d'abord sélectionner une console.", vbOKOnly + vbExclamation, "Ajouter un fichier rom")
            End If
     
        End Sub
    Voilà le code complet du bouton, avec la copie de fichier intégrée. Donc dans l'état le form "Patienter" s'affiche mais freeze également, et donc impossible d'y mettre une animation (même thread que la procédure de copie).

    Donc l'objectif, pour être clair : réussir à trouver un moyen pour que la copie du fichier sélectionné se fasse en arrière-plan, pendant que le form "Patienter" s'affiche avec une animation, et que ce dernier se ferme bien dès la fin de la copie du fichier

    Merci d'avance pour ceux qui se pencheront sur ce problème !

    --
    Shennong

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2012
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2012
    Messages : 80
    Par défaut
    J'espère que ça pourra te dépanner. C'est ce que j'ai sous la main. Sinon il y a les Task selon ta version du FrameWork .NET

    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
          Dim traitementThread As Thread = New Thread(
                    New ThreadStart(Sub()
     
                                        Dim EnvoieMessage As Action(Of Integer, Integer, String) = Sub(a, z, e)
                                                                                                       Invoke(New MethodInvoker(Sub() updateCompteur(a, z, e)))
                                                                                                   End Sub
     
                                        'do something
     
     
    'Appelle envoieMessage pour afficher quelque chose sur le form
     
                                        Invoke(New MethodInvoker(Sub() done(INST.Traitement._rapport))) 'fin de traitement done()
                                    End Sub))
     
                traitementThread.SetApartmentState(ApartmentState.MTA)
                traitementThread.IsBackground = True
                traitementThread.Start()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub updateCompteur(ByVal pTraite As Integer, Optional ByVal pTotal As Integer = -1, Optional ByVal pMessage As String = "")
            msgLog(pMessage)
            spinner.Visible = True
            If pTotal <> -1 Then lbTotal.Text = pTotal.ToString
            If pMessage <> "" Then lbMessage.Text = pMessage
     
            If pTraite <> -1 Then
                lbSlash.Text = "/"
                lbtraite.Text = pTraite.ToString
            End If
     
            '    Me.Refresh()
        End Sub

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    Je passe ici rapidement, mais je dirais que tu devrais aller voir du coté de l'async/await, le but de l'asynchronisme étant justement de ne pas bloquer une interface en attendant le retour d'une méthode.
    Donc pour faire simple tu passes en async ta méthode de téléchargement du fichier et tu l'await lors de l'appel à cette méthode.
    Renseigne toi avec et je répondrais à tes questions (promis avec plus de détails )

    [EDIT] le framework nous fournit une méthode de copie asynchrone toute faite => steam.CopyToAsync. Utilise la à la place de File.Copy ... et ton interface ne bloquera plus et si tu veux afficher un gif ou un truc qui tourne tu n'auras plus de problème.

    J@ck.

  4. #4
    Membre éclairé Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    Février 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien Informatique/Hotliner
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 186
    Par défaut
    Merci mille fois J@ckHerror ! et merci à toi également myNameIsFlo !

    J'ai essayé directement la méthode de J@ck, et ça marche du tonnerre !

    Effectivement, c'est simple à mettre en oeuvre et ça permet d'éviter le freeze dans l'appli. J'avais jamais entendu parler de cette façon de faire, l'avais-tu déjà utilisée ?

    C'est simple, rapide et efficace ... j'adhère !!!


    Merci encore pour votre aide précieuse, je vais pouvoir avancer dans mon projet !

    Bonne fin de journée à vous les amis

    --
    Shennong

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,



    Je l'utilise tous les jours pour tout ce qui est accès à des ressources que se soit accès fichier ou bdd.
    C'est en effet relativement simple, si tu veux en saisir toutes les subtilités tu peux aller voir l’excellent blog d'olivier Dahan.
    Il a toute une série sur Task.

    Bon code,
    J@ck.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Par défaut
    Bonjour à tous,

    Sujet intéressant ....
    Est-ce qu'une âme charitable pourrait me donner un exemple pour copier un fichier. La doc msdn donne un exemple pour le contenu d'un dossier complet.
    En fait, j'ai 5 fichiers précis à copier d'un dossier A vers un dossier B.

    Merci d'avance

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

Discussions similaires

  1. Aide sur les Thread
    Par walid kh dans le forum VB.NET
    Réponses: 8
    Dernier message: 06/04/2010, 12h18
  2. besoin d'aide sur les thread
    Par demonofshadow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 14/01/2010, 15h07
  3. aide sur les thread
    Par aurel_le_ouf dans le forum C#
    Réponses: 1
    Dernier message: 26/03/2008, 16h16
  4. Aide sur Multi-Threading
    Par Fred2209 dans le forum Windows
    Réponses: 7
    Dernier message: 18/04/2007, 17h26
  5. Aide sur les Threads
    Par themoye dans le forum MFC
    Réponses: 24
    Dernier message: 06/03/2005, 15h02

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