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 :

Form et Thread


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 2
    Par défaut Form et Thread
    Salut,

    Je développe une application Windows et voilà mon souci:
    Je crée une Form1. Dans cette Form1 se trouve un bouton qui une fois cliqué ouvre une Form2 en tant que nouveau thread. Comment faire pour que, une fois le code exécuté, la fermeture de la Form1 provoque également la fermeture de la Form2 ?

    Merci

  2. #2
    Membre chevronné Avatar de nemo69500
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 639
    Par défaut
    je fais pas du C# tous les jours , et pas du tt au taf , mais essaye de voir, il doit y avoir un évenement "close" ou un truc comme ca , sur la form1 et la dedans tu rajoute delete Form2 ou un truc du genre style Form2.close(). je pense qu'il doit y avoir une fonction pour detruire cette form. De toute facon tu y a acces etant donnée que c'est toi qui la créé

    j'espere que t a compris ce que je dis lol

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 18
    Par défaut
    Il existe un composant nommé BackgroundWorker pour faire du traitement asynchrone dans des Winforms

    Dans ton cas :

    Déclarer dans la classe de ta Form1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private BackgroundWorker bgw = new BackgroundWorker();
    Créer une méthode Bgw_DoWork qui contiendra le code à exécuter ; à savoir créer la deuxième Form et l'ouvrir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void Bgw_DoWork(object sender, DoWorkEventArgs e) {
    Form2 form = new Form2();
    form.show();
    }
    Dans la méthode OnClick de ton bouton ; Assigner un DoWorkEventHandler qui référence la méthode Bgw_DoWork à l'évènement DoWork du BackgroundWorker et ensuite lancer l'exécution de cette méthode grace à la méthode RunWorkerAsync().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bgw.DoWork+=new DoWorkEventHandler(Bgw_DoWork);
    bgw.RunWorkerAsync();

    Logiquement si tu fais un Dispose() de la Form1 lors de sa fermeture, le composant BackgroundWorker sera lui aussi Disposé et avec lui la Form2.

    Maintenant j'ai jamais essayé de créer une seconde Form avec ce composant mais je vois pas pourquoi ça marcherait pas.

    Plus d'info sur le BGW : http://glarde.developpez.com/dotnet/bgworker/cs/

    Bonne chance

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    en utilisant le backgroundworker, le probleme est que bien que disposé le thread sous-jacent n'est pas terminé, l'application se fermera quand meme car le bgw travaillant avec un thread background, il ne retiendra pas l'application. Une alternative, un peu plus propre, AMHA :

    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                //Si on dispose cette form, toute les boucles de messages de l'appli
                // appelleront un ExitThread() et les Run() correspondant retourneront.
                this.Disposed += delegate
                {
                    Application.Exit();
                };
            }
     
     
            private void button1_Click(object sender, EventArgs e)
            {
                Thread t = new Thread(
                    delegate()
                    {
                        Form2 f = new Form2();
                        Application.Run(f);
                        f.Dispose();                    
                    });
                t.SetApartmentState(ApartmentState.STA);
                t.Start();
            }
        }
    }
    Bon courage.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    D'accord avec SirJulio... si tu appelles juste Show dans le 2e thread, celui-ci va se terminer tout de suite, vu que la méthode Show n'est pas bloquante. Il vaut donc mieux créer une nouvelle boucle de messages avec Application.Run dans un nouveau thread.

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 2
    Par défaut
    Merci, la méthode de SirJulio fonctionne très bien !

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

Discussions similaires

  1. Changer une forme avec thread
    Par shawidoom dans le forum Autres ERP
    Réponses: 0
    Dernier message: 13/02/2013, 22h23
  2. [Problème conception] Form et Thread
    Par Nixeus dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 31/01/2011, 20h23
  3. form et thread
    Par chamamo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 23/02/2007, 16h09
  4. Assigner une forme a un thread
    Par riou93 dans le forum Langage
    Réponses: 5
    Dernier message: 08/08/2005, 11h32
  5. [C#]Thread, event/delegate et Form
    Par doccpu dans le forum Windows Forms
    Réponses: 28
    Dernier message: 01/08/2005, 18h35

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