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 :

[C#.NET 2] Thread "en attente"


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 352
    Points : 136
    Points
    136
    Par défaut [C#.NET 2] Thread "en attente"
    Bonjour,

    J'aimerai faire des événements en attente d'une action, par exemple un clic sur un bouton déclanche une longue recherche en base afin de remplir un DataGridView. Durant que la recherche se déroule, j'aimerai :
    1) Mettre le curseur de la souris en attente (sablier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.Cursor = Cursors.WaitCursor;
    2) faire une animation, genre barre d'avancement

    Je penses que le Thread peut résoudre mon problème, or je ne sais pas comment m'en servir ?! Déjà, est-ce possible... Et facile ?

    Merci

  2. #2
    Membre chevronné Avatar de LooserBoy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 1 085
    Points : 1 976
    Points
    1 976
    Par défaut
    Voici un bout de code qui affiche une forme sur laquelle une picturebox affiche un gif animé.
    Cela peut certainement t'aider... (WIP = Work In Progress )
    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
    public partial class WIP : Form
        {
            public delegate void DelegateCloseWip();
     
            private static WIP _instance;
            private DelegateCloseWip _closeDelegate;
     
            private WIP()
            {
                InitializeComponent();
     
                _closeDelegate = new DelegateCloseWip(InternalClose);            
            }
     
            public static void StartWip()
            {
                Thread InstanceCaller = new Thread(new ThreadStart(MyWipThreadFunc));
                InstanceCaller.Start();
                while (!InstanceCaller.IsAlive) ;
            }
     
            public static void CloseWip()
            {
                try
                {
                    if (_instance != null)
                        _instance.Invoke(_instance._closeDelegate);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
     
            private static void MyWipThreadFunc()
            {
                _instance = new WIP();
                _instance.ShowDialog();
            }
     
            private void InternalClose()
            {
                _instance.Close();
                _instance.Dispose();
            }
        }
    [EDIT]Code complet de ma petite forme.
    Utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WIP.StartWIP();
    // Traitement long...
    WIP.CloseWIP();
    [/EDIT]
    Fichiers attachés Fichiers attachés
    Vu sur un paquet de cigarettes: "Fumer peut entrainer une mort lente et douloureuse"
    - Vivre aussi... Ce n'est pas forcément moins douloureux et c'est même beaucoup plus lent...

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 352
    Points : 136
    Points
    136
    Par défaut
    Merci.

    ça fonctionne bien 1 fois, puis la 2ème fois ça ferme l'appli

    Je vais regarder de plus près (je ne vois pas l'image animé) mais pour le principe ton code m'aide bien, merci.

  4. #4
    Membre chevronné Avatar de LooserBoy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 1 085
    Points : 1 976
    Points
    1 976
    Par défaut
    Citation Envoyé par Ticoche Voir le message
    ça fonctionne bien 1 fois, puis la 2ème fois ça ferme l'appli
    C'est en prod...
    Vu sur un paquet de cigarettes: "Fumer peut entrainer une mort lente et douloureuse"
    - Vivre aussi... Ce n'est pas forcément moins douloureux et c'est même beaucoup plus lent...

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 352
    Points : 136
    Points
    136
    Par défaut
    J'ai modifier un peu, pour avoir un curseur sablier, ça fonctionne. Est-ce que ça se fait un type de retour pour ce genre de thread (Cursor) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            public static Cursor StartWip()
            {
                return Cursors.WaitCursor;
            }
     
            public static Cursor CloseWip()
            {
                return Cursors.Default;
     
            }
    édit: Je vois l'image et ça fonctionne bien... UNE fois, après ça ferme la MDI principale mais l'appli tourne toujours !

  6. #6
    Membre chevronné Avatar de LooserBoy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 1 085
    Points : 1 976
    Points
    1 976
    Par défaut
    Je pense voir ce qui ce passe...
    Le code que j'ai mis, tu l'a intégré à la forme principale c'est ca?

    Je pense que tu n'as pas tout à fait compris comment fonctionne mon WIP.
    Le WIP est une forme independante.
    Si je reprends ton post original, tu recupere les sources que j'ai mis en piiece jointe. Tu l'ajoute à ton projet puis à l'usage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    This.Cursor = Cursors.Wait;
    WIP.StartWIP();
    // Traitement long...
    WIP.CloseWIP();
    This.Cursor = Cursors.Default;
    En detail, cela permet d'afficher une forme qui affiche ce que l'on veux dans un thread autre que le principal.
    Vu sur un paquet de cigarettes: "Fumer peut entrainer une mort lente et douloureuse"
    - Vivre aussi... Ce n'est pas forcément moins douloureux et c'est même beaucoup plus lent...

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 352
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par LooserBoy Voir le message
    Je pense voir ce qui ce passe...
    Le code que j'ai mis, tu l'a intégré à la forme principale c'est ca?

    Je pense que tu n'as pas tout à fait compris comment fonctionne mon WIP.
    Le WIP est une forme independante.
    Si je reprends ton post original, tu recupere les sources que j'ai mis en piiece jointe. Tu l'ajoute à ton projet puis à l'usage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    This.Cursor = Cursors.Wait;
    WIP.StartWIP();
    // Traitement long...
    WIP.CloseWIP();
    This.Cursor = Cursors.Default;
    En detail, cela permet d'afficher une forme qui affiche ce que l'on veux dans un thread autre que le principal.
    ça fonctionne parfaitement ! Merci beaucoup.
    Du coup, je vais ajouter dans ta form le curseur sablier, sinon sur la page j'ai bien le sablier mais pas sur la Form qui apparait.

    Tu me permets d'utiliser et d'adapter ton code ?

  8. #8
    Membre chevronné Avatar de LooserBoy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 1 085
    Points : 1 976
    Points
    1 976
    Par défaut
    C'est fourni pour ca!
    Vu sur un paquet de cigarettes: "Fumer peut entrainer une mort lente et douloureuse"
    - Vivre aussi... Ce n'est pas forcément moins douloureux et c'est même beaucoup plus lent...

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 352
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par LooserBoy Voir le message
    C'est fourni pour ca!
    Merci

    J'ai encore des petits problème, quand j'execute la première fois ça va, et après ça reste toujours affiché ! (quand on quitte le prog, comme le thread est toujours lancé, il faut arreter le débug)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            private void button1_Click(object sender, EventArgs e)
            {
                this.Cursor = Cursors.WaitCursor;
                WIP.StartWip();
                filtrage();
                WIP.CloseWip();
                Cursor = Cursors.Default;
            }
    En fait, je lance mon fitrage (clic sur bouton) => ça va !
    Après, je clic encore sur filtrage (ça sert à rien et c'est pas un comportement normal puisque j'ai déjà mes infos... mais admettons) => la Form WIP reste affichée, on l'enlève par Alt+F4

  10. #10
    Membre chevronné Avatar de LooserBoy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 1 085
    Points : 1 976
    Points
    1 976
    Par défaut
    Cela veux dire que le CloseWIP n'est pas appellé ou il est possible que le CloseWIP ne fasse pas ce pour quoi il est fait (tres rare mais possible -> bug M$)...
    Solution "cradopoulo" : Faire un closeWIP à la sortie du prog.
    Vu sur un paquet de cigarettes: "Fumer peut entrainer une mort lente et douloureuse"
    - Vivre aussi... Ce n'est pas forcément moins douloureux et c'est même beaucoup plus lent...

  11. #11
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 352
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par LooserBoy Voir le message
    Cela veux dire que le CloseWIP n'est pas appellé ou il est possible que le CloseWIP ne fasse pas ce pour quoi il est fait (tres rare mais possible -> bug M$)...
    Solution "cradopoulo" : Faire un closeWIP à la sortie du prog.
    Pourtant en mode Debug, tout fonctionne bien, plusieurs fois. Est-ce parce que l'action est trop rapide (j'ai fait un test sur une attente de <1s) ?

    édit: Bon, ça fonctionne maintenant...
    Par contre si je place le code à 2 endroits différent dans ma page il n'aime pas... y'a peut être (surement) un conflit avec l'instance !

  12. #12
    Membre chevronné Avatar de LooserBoy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 1 085
    Points : 1 976
    Points
    1 976
    Par défaut
    C'est tout à fait possible oui.
    Il faut un certain temps pour que le thread se "spawn", affiche la forme et capte le fait qu'il doit s'arreter.
    S'il n'a pas fini de se "spawner" et qu'il lui est demandé de s'arreter, il va ignorer purement l'appel d'arrêt.
    Modif possible:
    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
     
    private static bool _isAlive;
            public static void StartWip()
            {
                Thread InstanceCaller = new Thread(new ThreadStart(MyWipThreadFunc));
                _isAlive = false;
                InstanceCaller.Start();
                while (!InstanceCaller.IsAlive) ;
                _isAlive = true;
            }
     
            public static void CloseWip()
            {
                try
                {
                    while (!_isAlive) ;
                    if (_instance != null)
                        _instance.Invoke(_instance._closeDelegate);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
    Vu sur un paquet de cigarettes: "Fumer peut entrainer une mort lente et douloureuse"
    - Vivre aussi... Ce n'est pas forcément moins douloureux et c'est même beaucoup plus lent...

  13. #13
    Membre chevronné Avatar de LooserBoy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 1 085
    Points : 1 976
    Points
    1 976
    Par défaut
    Citation Envoyé par Ticoche Voir le message
    édit: Bon, ça fonctionne maintenant...
    Par contre si je place le code à 2 endroits différent dans ma page il n'aime pas... y'a peut être (surement) un conflit avec l'instance !
    Oui! l'instance est static!
    Le top serait de gerer une liste d'instances...
    Vu sur un paquet de cigarettes: "Fumer peut entrainer une mort lente et douloureuse"
    - Vivre aussi... Ce n'est pas forcément moins douloureux et c'est même beaucoup plus lent...

  14. #14
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 352
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par LooserBoy Voir le message
    Oui! l'instance est static!
    Le top serait de gerer une liste d'instances...
    En tout cas je te remercie beaucoup, je marque le sujet comme résolu

    édit: Par contre je ne connais pas ce genre de "boucle" :
    while (!_isAlive) ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Tant que CONDITION
      Faire RIEN
    Fin Tant que
    ???

  15. #15
    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
    Salut,

    pour la boucle, oui, c'est parceque c'est pas tres "joli" de poller le statut comme ca. Theoriquement, on aurait du utiliser un event (en terme de threading) pour faire ca propre (un waitone() à la place de la boucle et un set dans la form), mais bon, quand bien meme un thread ne se lance pas vite, c'est pas dramatique.

  16. #16
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 352
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Salut,

    pour la boucle, oui, c'est parceque c'est pas tres "joli" de poller le statut comme ca. Theoriquement, on aurait du utiliser un event (en terme de threading) pour faire ca propre (un waitone() à la place de la boucle et un set dans la form), mais bon, quand bien meme un thread ne se lance pas vite, c'est pas dramatique.
    C'est noté, merci.

  17. #17
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 49
    Points : 24
    Points
    24
    Par défaut
    Bonjour, je me suis inspiré de ce post .
    Mais j'ais un souci, lors de l'affichage l'element d'attente est independant du formulaire, c'est à dire que dès lors je deplace le formulaire principal le message de chargement reste positionné à la meme place, j'aimerais qu'il soit rattaché à un control datagridview dans le Form principal. Mais je ne voies pas comment.

    Merci.
    Sinon splendide bout de code.

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

Discussions similaires

  1. [VB.Net 1.1] Comment "échapper" une quote ?
    Par arnolem dans le forum VB.NET
    Réponses: 1
    Dernier message: 07/09/2006, 10h39
  2. [vb.net] [System.Threading] Etats d'un Thread
    Par arnolem dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/01/2006, 16h41

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