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 Presentation Foundation Discussion :

Pb utilisation backgroundworkers et form d'attente


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Par défaut Pb utilisation backgroundworkers et form d'attente
    Bonjour,

    Dans le carde d'un application wpf J'essaye d’implémenter une fenêtre d'attente avec un progressbar qui s'affiche lors d'un traitement avec backgroundworker.

    Lors du premier appel ça marche très bien. Seulement après même si le traitement se passe la fenêtre n’apparaît plus.

    Code form principale:

    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
     
        Private Delegate Sub LoadDataDelegate()
        Dim _LoadDataDelegate = New LoadDataDelegate(AddressOf LoadData)
     
    ...
     
        Private Sub ButtonLoad_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles ButtonLoad.Click
     
            Me.BackgroundWorkerLoad = New BackgroundWorker()
            Me.BackgroundWorkerLoad = New System.ComponentModel.BackgroundWorker()
            Me.BackgroundWorkerLoad.WorkerReportsProgress = True
            Me.BackgroundWorkerLoad.WorkerSupportsCancellation = True
     
            Me.Cursor = Cursors.Wait
            Me.IsEnabled = False
            ILOJTnFormWait.ShowFormWait()
     
            Me.BackgroundWorkerLoad.RunWorkerAsync()
     
        End Sub
     
    #Region "BackgroundWorkers"
        Private Sub BackgroundWorkerLoad_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorkerLoad.DoWork
            Me.Dispatcher.Invoke(_LoadDataDelegate)
        End Sub
     
        Private Sub BackgroundWorkerLoad_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorkerLoad.RunWorkerCompleted
            ILOJTnFormWait.CloseFormWait()
            Me.IsEnabled = True
            Me.Cursor = Cursors.Arrow
        End Sub
    #End Region
    Code de ma form d'attente:
    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
     
        Private Shared _FrmWait As ILOJTnFormWait
     
        Public Sub New()
            InitializeComponent()
        End Sub
     
        Public Shared Sub ShowFormWait()
            'If _FrmWait Is Nothing Then
            _FrmWait = New ILOJTnFormWait()
            'End If
            _FrmWait.Topmost = True
            _FrmWait.WindowStartupLocation = Windows.WindowStartupLocation.CenterScreen
            _FrmWait.Show()
        End Sub
     
     
        Public Shared Sub CloseFormWait()
            If _FrmWait IsNot Nothing Then
                _FrmWait.Close()
                '_FrmWait = Nothing
            End If
        End Sub
    Je cherche d'ou peut venir le problème mais je ne voit pas.
    Quand j'execute le code pas à pas tout semble cohérent et le code se déroule propremment.

    Mais à partir du deuxième appel l'execution de "ILOJTnFormWait.ShowFormWait()" n'engendre plus l'affichage de ma form.

    Quelqu'un aurait-il une idée? cela viendrait-il de la manière dont je ferme ma form d'attente?

    Cordialement,
    Christophe

  2. #2
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 60
    Par défaut
    Je n'ai pas la solution, mais j'ai j'ai vu que tu fais un Dispatcher.Invoke() dans la méthode principale (dowork) de ton background worker, du coup tu bloque le thread ui pendand toute la durée du traitement et tu perd le bénéfice du background worker.

    Essaye plutôt de ne faire que du chargement de donnée (sans toucher aux controles de l'interface) dans la méthode dowork, puis quand le travail est terminé, tu fait le Dispatcher.Invoke pour passer la main au thread ui et intialiser tes controles.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Par défaut
    Merci pour la réponse et la précision sur le backgroundworker qui ne sert pas à gd chose ici en effet.
    Du coup je m'en passe mais le problème concernant l'affichage de la form d'attente persiste tjs.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Par défaut
    En fait ma fenêtre s'affiche mais l’intérieur n'apparait pas.
    C'est a dire présente dans la bar des taches, le cadre autour apparait (je l'avais enlevé avant) mais pas l'interieur.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Par défaut
    Je me permet de préciser mon problème une nouvelle fois.
    En fait n'ayant pas beaucoup d'experience sur la question je crois que je me mélange les pinceaux niveau backgrounworkers et interaction avec une "form d'attente" (en gros juste une progress bar dans une nouvelle fenetre).

    J'arrive à l'implémenter pour des traitements tres simple comment on peut trouver en demo (ex compteur etc...)

    Le pb est que le traitement que j'ai à faire est plus complexe. Non seulement mon aplli intéragit avec un autre logiciel (pas de soucis) mais également avec d'autre control de ma form principale (ex: treeview) et ce dernier point pose problème.

    Dois-je impérativement chercher à réorganiser mon traitement afin d'avoir d'un coté le traitement externe et d'un autre la maj des controles de ma forme?
    ou est-il possible de s'en soustraire et d'avoir ma form qui s'affiche avec la progressbar qui roule et derriere mon traitement dans la form principale sans que cette dernière prenne le pas.

    Une autre question concerne une probable évolution de mon traitement afin d'afficher un nom de fichier traité dans ma form "d'attente". Je cherche des exemples mais pour l'instant bloque également sur ce point même dans un cas simple.

    Si quelqu'un à des conseils ou à déjà eu à faire ce genre de chose je lui serais reconnaissant de m'en faire profiter.

    Cordialement,
    christophe.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Par défaut
    En cherchant et "bidouillant" J'ai réussi a régler mon problème. Mais je ne saurai l'expliquer précisément.

    En fait j'ai gardé ma forme d'attente et mon backgroundworker.

    Lors de l'execution de mon long process, chaque fois que je levais une execption (en gros chaque fois que j'avais un interaction sur un control de ma forme principal) j'utilise

    Me.dispatcher.invoke(sub() mySub()) ou Me.dispatcher.invoke(function() myFunction())

    J'arrive bien au résultat escompter à savoir que ma progress bar defile pendant mon traitement. Seulement si quelqu'un saurait m'expliquer pourquoi cette manière de faire fonctionne et si elle possède des limites ou n'importe quelles autres precisions afin que j'en sache un peu plus.

    Cordialement,
    Christophe.

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

Discussions similaires

  1. [JAVA] l'utilisation de deux forms
    Par DavidPAY dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 04/06/2008, 02h31
  2. NCURSES/UTILISATION DE PLUSIEUR FORMS DANS PLUSIEUR PANEL
    Par VITALTH dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 25/03/2008, 17h39
  3. utilisation d'un form dans un autre form
    Par luron dans le forum C#
    Réponses: 1
    Dernier message: 29/02/2008, 09h20
  4. Variable global utilisable dans plusieurs Forms
    Par nams2590 dans le forum Visual C++
    Réponses: 13
    Dernier message: 11/12/2007, 11h34
  5. Form d' attente au chargement du programme
    Par Wilco dans le forum Delphi
    Réponses: 7
    Dernier message: 21/07/2006, 00h52

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