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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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 confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    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 confirmé 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
    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 é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
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    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)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé 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
    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

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