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 :

BeginInvoke bloque la WinForm


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 198
    Points : 106
    Points
    106
    Par défaut BeginInvoke bloque la WinForm
    Bonjour,

    Je résume et simplifie mon problème :
    J'ai une winForm contenant un bouton qui lance une méthode (qui dure longtemps), durant que la méthode s'execute j'aimerais pouvoir continuer à naviguer sur mon application hors je n'y arrive pas, la winform se bloque jusqu'à ce que la méthode ait fini. Seriez-vous comment lancer cette méthode tout en gardant l'interactivité de l'application?


    Voila mon 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
     
    public partial class GUIConnexion : UserControl
        {
            private delegate void Export (int i);
     
            public GUIConnexion()
            {
                InitializeComponent();
            }
     
            private void OnClick(object sender, EventArgs e)
            {
               this.BeginInvoke( new Export(ExportBadges),1 );
            }
     
            private void ExportBadges(int i)
            {
                Communication.ExportListBadge();
            }
        }
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void OnClick(object sender, EventArgs e)
            {
               MethodInvoker m = new MethodInvoker(delegate{
                  ExportBadges(1);
              });
              m.BeginInvoke();
            }
     
            private void ExportBadges(int i)
            {
                Communication.ExportListBadge();
            }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 198
    Points : 106
    Points
    106
    Par défaut
    Merci ça marche super

    Je ne voudrais pas abuser mais tu saurais comment je pourrais faire pour avoir l'accès à un composant de la Winform.
    Je m'explique j'ai donc ma winform avec une progressBar que je veux modifier au fur et à mesure que ma méthode s'exécute. Seulement à l'exécution j'ai une erreur Cross Thread .

    Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on."}

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    this.Invoke(new MethodInvoker(delegate{
                  /* ici on peux accéder aux composants de la form,
                  * mais ce code est exécuté sur le thread principal et l'appel est bloquant
                  */
              }));
    On peut aussi utiliser this.BeginInvoke qui fonctionne comme on le pense lorsqu'on est à partir d'un autre thread.

Discussions similaires

  1. [VS.NET] [WinForms] [VB.NET] Créer un installeur
    Par Fruity dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/05/2008, 15h50
  2. Bloque la date et l'heure sous Win XP ??
    Par Djedjeridoo dans le forum Windows
    Réponses: 2
    Dernier message: 05/04/2004, 12h11
  3. Réponses: 2
    Dernier message: 23/03/2004, 12h23
  4. Réponses: 1
    Dernier message: 23/02/2004, 12h58
  5. bloqué en mode Release
    Par matsch77 dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 17h17

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