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 :

probleme avec un Form dans un Thread


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de cyrille37
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2005
    Messages : 155
    Points : 120
    Points
    120
    Par défaut probleme avec un Form dans un Thread
    Bonjour,

    J'ai fait vite fait une classe pour afficher un Form avec un message d'attente.
    Pour que ce Form s'affiche pendant qu'une opération se déroule, j'ai créé le Form depuis un Thread.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
        public partial class WaitWindow : Form
        {
            static Thread _thd;
            static String _message;
     
            public static void Show(String message)
            {
                if (_thd != null)
                {
                    Hide();
                }
                _message = message;
                _thd = new Thread(new ThreadStart(threadProc));
                _thd.Start();
     
            }
            public static void Hide()
            {
                _thd.Abort();
            }
     
            static void threadProc()
            {
                WaitWindow ww = new WaitWindow();
                ww.label1.Text = _message;
                ww.Show();
                ww.Refresh();
                try
                {
                    while (true)
                    {
                        ww.progressBar1.Value++;
                        Thread.Sleep(100);
                    }
                }
                catch (ThreadAbortException)
                {
                    Debug.WriteLine("Aborted");
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Argh! "+ex.Message);
                }
                ww.Close();
                ww = null;
            }
     
            protected WaitWindow()
            {
                InitializeComponent();
            }
     
        }
    C'est simple, mais ça ne doit pas être correct de faire comme ça.

    J'utilise .Net2 et Windows Vista. Quand la fenêtre est affichée au bout de qlqs secondes Vista affiche dans le titre de la fenetre qu'elle ne "répond pas" et la fenêtre devient vide.

    Selon mais vieux souvenir, c'est qu'il doit manquer qlqs chose comme une "pompe à messages" ...

    Auriez vous une idée pour me corriger ?
    Merci
    Cyrille

  2. #2
    mow
    mow est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Points : 166
    Points
    166
    Par défaut
    Pour faire ce ue tu veux faire je pense que tu devrais utiliser le composant BackgroundWorker...
    Enfin je crois....

    Mow

  3. #3
    Membre régulier Avatar de cyrille37
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2005
    Messages : 155
    Points : 120
    Points
    120
    Par défaut
    Citation Envoyé par mow Voir le message
    tu devrais utiliser le composant BackgroundWorker...
    Mow
    Oui, mais ... Le BackgroundWorker est pour lancer une opération en tâche de fond. Je l'utilise souvent. Mais il faut bien architecturer son application.

    Mais là, je voulais me faire une simple fenêtre que je peux afficher n'importe quand, sans avoir à me soucier de l'architecture de l'application. Du genre, tiens là ça va être long, j'affiche la fenêtre et quand c'est fini je la cache.

    Ce n'est pas pour une "Belle" application, mais pour des petites applis de tous les jours (test, calculs divers)

    Cyrille.

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par cyrille37 Voir le message
    Selon mais vieux souvenir, c'est qu'il doit manquer qlqs chose comme une "pompe à messages" ...
    Salut Cyrille,

    tout à fait, il manque une boucle de rappel, et en .Net, il est lancé par un Application.Run(Form), donc supprime à partir de ww.Show() et la boucle while et remplace par cette derniere (c'est bloquant pas besoin de boucler).

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    étrange en effet
    le thread c'est pour le traitement, là tu ouvre ta fenetre et tu mets rien dedans, tu la fermeras quand t'en auras plus besoin

    tu peux créer un évènement qui sera lancé par ton thread quand il sera terminé
    (meme avec .show ca peut suffire)

  6. #6
    Membre régulier Avatar de cyrille37
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2005
    Messages : 155
    Points : 120
    Points
    120
    Par défaut
    Bonjour,

    merci pour vos réponses. Je ne les ais pas très bien comprises.

    Est-ce que vous me dites qu'il ne faut pas faire tourner des fenêtres dans différents threads, et que les threads sont uniquement pour des traitements sans GUI ?

    Moi j'aime bien l'idée d'avoir des fenêtres indépendantes, dans le genre "GuiThread". Mais peut être n'est pas possible ?

    Pouvez vous essayer d'être plus précis s'il vous plaît, je suis dur de la feuille ;-)

    Merci encore
    Cyrille

  7. #7
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    perso je pense que tu peux très bien créer une fenêtre qui s'affiche au debut d'un thread et se ferme pour terminer un thread.
    Si j'avais du faire ça, j'aurais certainement utilisé une interface du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface IWaitingWindow
    {
       void Show();
       void Close();
    }
    La fenêtre (ou les fenêtres) d'attente devrait implémenté cette interface, et l'objet qui va lancer le thread pourrait prendre un objet de type IWaitingWindow (donc tu pourrais avoir plusieurs fenêtres d'attentes différentes). Au début du thread tu fais un Show, puis un Close en fin de traitement.

  8. #8
    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
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par cyrille37 Voir le message
    Est-ce que vous me dites qu'il ne faut pas faire tourner des fenêtres dans différents threads, et que les threads sont uniquement pour des traitements sans GUI ?
    C'est bien ça. L'application crée un thread pour la gestion de l'interface, c'est ce que fait le Application.Run(...). Il est donc conseiller de déléguer tout ce qui concerne l'affichage à ce thread spécifique et d'utiliser des événements (par exemple) pour communiquer entre les différents thread de travail.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/03/2006, 19h51
  2. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  3. [Système]Probleme avec un chemin dans cmd.exe
    Par Sarrus dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 14/09/2005, 08h31
  4. Réponses: 11
    Dernier message: 12/04/2005, 14h08
  5. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32

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