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 :

Bouton d'interface graphique bloqué


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut Bouton d'interface graphique bloqué
    Bonjour à tous,
    J'ai fait un programme C# avec une interface graphique sous Visual Studio 2005, et une fonctionnalité de test. Lorsque je clique sur ON le test démarre et sur OFF le test devrait s'arrêter.
    Le problème, c'est que lorsque je clique sur ON toute la GUI reste bloquée.
    Je me suis dit qu'il fallait peut-être réaliser la GUI dans un thread séparé du traitement, qu'en pensez-vous ?
    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par levalp Voir le message
    Bonjour à tous,
    J'ai fait un programme C# avec une interface graphique sous Visual Studio 2005, et une fonctionnalité de test. Lorsque je clique sur ON le test démarre et sur OFF le test devrait s'arrêter.
    Le problème, c'est que lorsque je clique sur ON toute la GUI reste bloquée.
    Je me suis dit qu'il fallait peut-être réaliser la GUI dans un thread séparé du traitement, qu'en pensez-vous ?
    Merci d'avance.
    C'est le traitement que tu dois mettre dans un thread séparé. Regarde du côté du BackgroundWorker.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    j'en pense que c'est la "seule" solution propre à faire

    sinon, tu pourrais toujours mettre dans ton algo de traitement du code genre

    application.DoEvent();

    mais j'en suis pas fan.. il vaut mieux faire un vrai Threading de ton traitement
    qui a passer le bouton en enabled = false tant que le traitement n'est pas
    achevé

    The Monz, Toulouse

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    OK, merci pour vos avis.
    Je vais essayer demain de mettre ça dans 1 thread séparé.

  5. #5
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Fait ton code async
    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
     
    				void AsyncImport_Callback(IAsyncResult result)
    				{
    					MethodInvoker caller = (MethodInvoker)result.AsyncState;
    					caller.EndInvoke(result);
    				}
     
    				void AsyncDoSomething()
    				{
    					for (int i = 0; i < 1000000; i++)
    					{
    						Debug.WriteLine(i.ToString());
    					}
    				}
     
    				private void button1_Click(object sender, EventArgs e)
    				{
    					MethodInvoker invoker = new MethodInvoker(AsyncDoSomething);
     
    					invoker.BeginInvoke(new AsyncCallback(AsyncImport_Callback), invoker);
     
    				}

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par shwin Voir le message
    Fait ton code async
    Salut Shwin,
    Merci pour ta suggestion et le code. La méthode AsyncDoSomething() sera-t-elle exécutée en parallèle comme si elle était dans un thread différent ?

  7. #7
    Expert confirmé
    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
    Par défaut
    Oui (d'ailleurs elle est dans un thread différent).

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par smyley Voir le message
    Oui (d'ailleurs elle est dans un thread différent).
    En fait, y'a un petit problème, c'est que la fonction que je désire réaliser en asynchrone doit lire une DataGridView qui est située sur ma GUI.
    Dois-je passer la DataGridView en paramètre de la fonction pour que ca fonctionne ?

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par levalp Voir le message
    En fait, y'a un petit problème, c'est que la fonction que je désire réaliser en asynchrone doit lire une DataGridView qui est située sur ma GUI.
    Dois-je passer la DataGridView en paramètre de la fonction pour que ca fonctionne ?
    Non tu dois passer par un Delegate et un BeginInvoke, pour pouvoir modifier les composants. En .NET 2.0, tu n'as plus le droit de modifier les composants à partir d'un autre thread que celui qui les a créés.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Non tu dois passer par un Delegate et un BeginInvoke, pour pouvoir modifier les composants. En .NET 2.0, tu n'as plus le droit de modifier les composants à partir d'un autre thread que celui qui les a créés.
    En fait je souhaite seulement lire les composants et pas les modifier.
    Dois-je quand même passer par un Delegate et un BeginInvoke ?

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par levalp Voir le message
    En fait je souhaite seulement lire les composants et pas les modifier.
    Dois-je quand même passer par un Delegate et un BeginInvoke ?
    Normalement oui (à vérifier), mais si ce n'est pas le cas, c'est une bonne habitude à prendre tout de même.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Normalement oui (à vérifier), mais si ce n'est pas le cas, c'est une bonne habitude à prendre tout de même.
    J'aimerais une petite précision : Peut-on utiliser les Delegate/Invoke avec un BackgroundWorker ?
    merci d'avance

  13. #13
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par levalp Voir le message
    J'aimerais une petite précision : Peut-on utiliser les Delegate/Invoke avec un BackgroundWorker ?
    merci d'avance
    Avec le bw, tu es sensé utiliser ReportProgress() dans le DoWork, et dans le handler de l'événement ProgressChanged tu peux modifier directement les composants sans passer par un delegate.
    Pour faire un chargement dynamique de données, je passerais plutot par un Thread classique avec un delegate.

    A toi de choisir ce que tu préfères.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  14. #14
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Tu peux lire ta grid en passant par un accessor


    Voici le code révisé
    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
     
    void AsyncImport_Callback(IAsyncResult result)
    {
    	MethodInvoker caller = (MethodInvoker)result.AsyncState;
    	caller.EndInvoke(result);
    }
     
    void AsyncDoSomething()
    {
    	//Ici tu peux acceder a MyGrid threadsafe
    	for (int i = 0; i < 1000000; i++)
    	{
    		Debug.WriteLine(i.ToString());
    	}
    }
     
    private object _mydatagridLock = new object();
    private DataGrid _mydatagrid;
    private DataGrid MyGrid
    {
    	get { return _mydatagrid;}
    	set { _mydatagrid = value; }
    }
     
    private void button1_Click(object sender, EventArgs e)
    {
    	lock(_mydatagridLock)
    	{
    		_mydatagrid = magrid;
    		MethodInvoker invoker = new MethodInvoker(AsyncDoSomething);
     
    		invoker.BeginInvoke(new AsyncCallback(AsyncImport_Callback), invoker);
    	}
    }

    l

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Avec le bw, tu es sensé utiliser ReportProgress() dans le DoWork, et dans le handler de l'événement ProgressChanged tu peux modifier directement les composants sans passer par un delegate.
    Pour faire un chargement dynamique de données, je passerais plutot par un Thread classique avec un delegate.

    A toi de choisir ce que tu préfères.
    Je vais essayer avec un BackgroundWorker directement. (sans delegate)
    Si quelqu'un a un exemple de code sous la main, je suis preneur.

  16. #16
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    DoEvent marche bien, mais peut impacter la forme du curseur (sablier), donc sauvegarder le curseur avant le DoEvent et restaurer après.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par Graffito Voir le message
    DoEvent marche bien, mais peut impacter la forme du curseur (sablier), donc sauvegarder le curseur avant le DoEvent et restaurer après.
    Salut Graffito,
    Je viens d'essayer avec DoEvents, ca marche mieux, peut-être pas encore parfaitement mais du moins la GUI n'est plus bloquée.
    En tous cas merci pour cette suggestion.

  18. #18
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Le doEvent avait aussi été suggéré par TheMonz31.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Le doEvent avait aussi été suggéré par TheMonz31.
    en effet, je n'avais pas tilté...

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Le doEvent avait aussi été suggéré par TheMonz31.
    La version avec DoEvents marche mieux mais ne plaît pas à mon chef, alors je vais quand même essayer de faire ca avec un thread séparé...

Discussions similaires

  1. [Débutant] gérer la visibilité des boutons par interface graphique
    Par Adem84 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 10/02/2010, 11h45
  2. Réponses: 1
    Dernier message: 22/02/2009, 20h54
  3. Interface graphique et clic de bouton
    Par Tsukaasa dans le forum EDT/SwingWorker
    Réponses: 5
    Dernier message: 12/09/2008, 16h13
  4. interface graphique avec bouton parcourir
    Par Wael Maaoui dans le forum Tkinter
    Réponses: 2
    Dernier message: 26/03/2007, 12h00
  5. [INTERFACE GRAPHIQUE] Bouton et CheckBox
    Par Hoegaarden dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 14/02/2006, 17h15

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