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

C# Discussion :

Codage Ninja, sablier et évènements [Sources]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Juillet 2005
    Messages
    195
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 195
    Par défaut Codage Ninja, sablier et évènements
    Bonjour & toutes & à tous,

    j'ai un formulaire contenant un bouton, ou lorsque l'on clique dessus en ensemble de commande s'exécute durant approximativement 7-8 sec.

    J'ai donc logiquement souhaité changer le curseur courant (fleche) par un sablier durant le tps de l'éxécution ...

    Sur la FAQ j'ai trouvé ces 3 lignes qui fonctionne très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          Cursor.Current = Cursors.WaitCursor;
          Thread.Sleep(5000);
          Cursor.Current = Cursors.Default;
    Ma question est donc la suivante:
    Existe t'il un moyen "plus propre" en jouant avec les évènements par exemple, pour afficher le sablier ?
    c'est typiquement le genre de codage que l'on ferai en procédural ... est-ce ainsi que je dois procéder en Objet ? (étant encore néophyte dans ce domaine)

    Merci d'avance.
    Thomas LEONARDI

  2. #2
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Un moyen plus propre serait d'effectuer le traitement dans un thread séparé. Ainsi tu ne bloquerais pas l'IHM.
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  3. #3
    Membre très actif
    Profil pro
    Expert technique .NET
    Inscrit en
    Août 2007
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Expert technique .NET

    Informations forums :
    Inscription : Août 2007
    Messages : 272
    Par défaut
    Salut,

    Pour être complet, voici comment faire avec un processus (je n'ai pas le code du thread sous la main, mais c'est aussi une bonne idée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Process proc = new Process();
     
    proc.StartInfo = new ProcessStartInfo(@strExecutableOuCommandes.ToString(), strParametres);
    proc.Start();
    proc.WaitForExit();
    Et pour être complet, tu as aussi la méthode shell, qui comme son nom l'indique, utilise une commande DOS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static int Shell(
    	string PathName,
    	AppWinStyle Style,
    	bool Wait,
    	int Timeout
    )
    Pense à mettre "Wait" à true. Attention, il faut inclure la référence Microsoft.VisualBasic (recopie bête et méchante de MSDN).

    Bonne chance

  4. #4
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Si tu ne peux pas déporter ton traitement vers un thread non IHM, je te conseille d'utiliser ce genre de classe pour gérer ton curseur :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
      /// <summary>
      /// Used to temporarily change the current mouse cursor.
      /// </summary>
      public class CursorKeeper : IDisposable
      {
        private Control _control;
        private Boolean _isDisposed = false;
        private Cursor  _originalCursor;
     
        /// <summary>
        /// Creates an instance of the class that sets <see cref="Cursor.Current" /> to a new cursor.
        /// </summary>
        public CursorKeeper(Cursor newCursor)
        {
          _originalCursor = Cursor.Current;
          Cursor.Current = newCursor;
        }
     
        /// <summary>
        /// Creates an instance of the class that sets a <see cref="Control"/>'s cursor to a new cursor.
        /// </summary>
        public CursorKeeper(Control control, Cursor newCursor)
        {
          _control = control;
          _originalCursor = _control.Cursor;
          _control.Cursor = newCursor;
        }
     
        /// <summary>
        /// Creates an instance of the class that sets a <see cref="Control"/>'s cursor to <see cref="Cursors.WaitCursor" />.
        /// </summary>
        public CursorKeeper(Control control) : this(control, Cursors.WaitCursor)
        {
        }
     
        /// <summary>
        /// Creates an instance of the class that sets <see cref="Cursor.Current" /> to <see cref="Cursors.WaitCursor" />.
        /// </summary>
        public CursorKeeper() : this(Cursors.WaitCursor)
        {
        }
     
        #region IDisposable members
     
        protected virtual void Dispose(bool disposing)
        {
          if (!_isDisposed)
          {
            if (disposing)
            {
              if (_control != null)
                _control.Cursor = _originalCursor;
              else
                Cursor.Current = _originalCursor;
            }
          }
     
          _isDisposed = true;
        }
     
        public void Dispose()
        {
          // Do not change this code.  Put cleanup code in Dispose(bool disposing) above.
          Dispose(true);
          GC.SuppressFinalize(this);
        }
     
        #endregion IDisposable members
      }
    Cette classe s'utilise ensuite via using :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      using (new CursorKeeper())
      {
        // traitement
      }
    Cela assure notamment que même en cas d'exception, le curseur est ramené à son état précédent.

  5. #5
    Membre confirmé

    Inscrit en
    Juillet 2005
    Messages
    195
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 195
    Par défaut
    j'aurai bien aimé passé par du multi-threading mais mon traitement (ecriture dans un fichier existant & impression de résultat nottament) n'est pas adapté ...

    par contre, un grand merci a greybird pour sa classe CursorKeeper !! ca dépasse mes attentes :p

  6. #6
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    No pb

  7. #7
    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 : 43
    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
    Citation Envoyé par Greybird Voir le message
    Cette classe s'utilise ensuite via using :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      using (new CursorKeeper())
      {
        // traitement
      }
    Cela assure notamment que même en cas d'exception, le curseur est ramené à son état précédent.
    Très classe...
    A ajouter à la rubrique sources

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

Discussions similaires

  1. Pas d'événement OnClose quand on arrête W2K
    Par Altau dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/01/2009, 18h36
  2. [Accents - XML] Problème de codage non supporté !!
    Par Smortex dans le forum Composants VCL
    Réponses: 6
    Dernier message: 24/11/2002, 11h00
  3. codage objet
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 22/08/2002, 16h49
  4. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10

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