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

Windows Forms Discussion :

Envoi de valeurs du BackGroundWorker vers un form avant la sortie de la fonction


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Par défaut Envoi de valeurs du BackGroundWorker vers un form avant la sortie de la fonction
    Bonjour,

    Je voudrais lister les fichiers d'un repertoire et afficher les chemin du fichier en cours dans un label pendant la recherche. Pour cela j'ai pensé à utiliser un BackGroundWorker. Le problème c'est que le BackGroundWorker ne peut pas renvoyer directement le chemin a mon thread principal pour qu'il soit affiché dans le label puisque la fonction ne sera pas terminée... Je ne vois donc pas comment faire pour envoyer le résultat au thread de mon form avant la fin.

    Voici le code que j'utilise pour le listage:
    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
    Public Function GetAllFiles(ByVal path As String) As String
            Dim sFiles As String()
            Dim sbBuffer As New StringBuilder
     
            Try
                sFiles = Directory.GetFiles(path)
                For Each fichier In sFiles
                    sbBuffer.AppendLine(fichier)
                    nbrFileFn2 += 1
                Next
     
                Dim sDir As String()
                sDir = Directory.GetDirectories(path)
                For Each dossier In sDir
                    sbBuffer.AppendLine(GetAllFiles(dossier))
                Next
            Catch ex As Exception
                sbBuffer.AppendLine(ex.Message)
            End Try
     
            Return sbBuffer.ToString
        End Function
    Est ce que quelqu'un a une solution?

    Merci d'avance

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    oui, ca doit etre expliqué dans la doc du backgroundworker d'ailleurs
    il y a une méthode ReportProgress, à laquelle tu peux passer des objets
    et ca déclenche un évènement (progresschanged) sur le thread principal (donc ok pour modifier l'interface) avec les objets que tu as passé
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expérimenté Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Par défaut
    OK je vais essayer ca.

    Par contre j'ai un autre problème: j'ai modifié un peu ma fonction et maintenant j'ai besoin de passer deux arguments. Mais il me semble que le backGroundWorker ne peut passer qu'un argument.

    Y a t il moyen de résoudre ce problème?

  4. #4
    Membre chevronné
    Avatar de Ogotcha
    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    Tu appel un fonction spécifique au moment du DoWork de ton BackGroundWorker
    Mon Blog
    FAQs DotNet
    Fonction utile : Recherche

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    tu peux passer une seule chose as object certes, mais tout dérivant de object ca laisse pas mal de place à l'imagination
    comme une instance de classe avec 2 membres ou encore plus simple, un tableau d'objet, une collection etc...

    exemple avec un tableau d'objet :

    bckw.reportprogress(new object(1){obj1,obj2})

    et de l'autre coté il faut surement faire

    directcast (e.JeSaisPlusQuoi,object())(0)
    directcast (e.JeSaisPlusQuoi,object())(1)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre expérimenté Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Par défaut
    Merci pour les réponses

    J'ai créé une classe pour passer mes arguments: ca marche impec! J'avoue que je n'y aurais jamais pensé ^^

    Par contre j'ai un problème avec l'événement BackgroundWorker.ProgressChanged:

    je le déclenche comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                For Each fichier In sFiles
                    Form1.BackgroundWorker1.WorkerReportsProgress = True
                    Form1.BackgroundWorker1.ReportProgress(0, fichier)
                    sbBuffer.AppendLine(fichier)
                    nbrFileFn2 += 1
                Next
    et dans l'événement je met ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
            lblChemin.Text = e.UserState.ToString()
        End Sub
    Mais lorsque je lance mon programme rien ne d'affiche dans le label. J'ai testé avec le débuger en mode pas a pas mais tout se déroule correctement et la valeur du chemin est bien passé a mon label...

    Quelqu'un aurait il une idée?

    Merci

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/03/2009, 12h23
  2. [Mail] Envoi de valeurs de checkbox vers un mail
    Par vansb dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2006, 23h43
  3. [VB.NET] Passer une valeur de control entre deux form
    Par TheMacleod dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/12/2005, 11h07
  4. envoie de valeur d'un formulaire vers un autre
    Par kleenex dans le forum Access
    Réponses: 7
    Dernier message: 03/10/2005, 16h55
  5. [VB6] Valeur de retour pour une Form
    Par preverse dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/08/2004, 17h16

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