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 :

Boucle avec interval régulier entre les instructions


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut Boucle avec interval régulier entre les instructions
    Bonjour à tous,

    Tout est dans le titre.

    Voici le code de la boucle dans laquelle je veux faire une pause.

    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
     
    for (int i = 0; i < tirages.Count(); i++)
                {
                    for (int j = 0; j < joueurs.Count(); j++)
                    {
                        joueur = joueurs[j];
                        tirage = tirages[i];
     
                        for (int k = 0; k < 6; k++)
                        {
                            for (int l = 0; l < 6; l++)
                            {
                                if (joueur.Numeros[k].Numero == tirage.Numeros[l].Numero)
                                {
                                    joueur.Numeros[k].Tire = true; 
                                    // Je veux faire ma pause ici
                                }
                            }
                        }
     
                    }
                    tirage.Verifie = true;
                    readerXml.UpdateTirage(tirage);
                }
    J'aimerai qu'à chaque fois que l'une des propriété Tire d'un des joueur est modifiée, qu'une pause soit faite.

    Merci.

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Bonjour,

    Tu peux "endormir" le thread grâce à la méthode statique Sleep.
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    J'ai essayé ceci

    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
     
    for (int i = 0; i < joueurs.Count(); i++)
                {
                    for (int j = 0; j < tirages.Count(); j++)
                    {
                        Joueur joueur = joueurs[i];
                        Tirage tirage = tirages[j];
     
                        for (int k = 0; k < 6; k++)
                        {
                            for (int l = 0; l < 6; l++)
                            {
                                if (joueur.Numeros[k].Numero == tirage.Numeros[l].Numero)
                                {
                                    joueur.Numeros[k].Tire = true;
                                    Thread.Sleep(100);
                                }
                            }
                        }
     
                    }
                }
    le soucis c'est que le programme met énormément de temps à répondre, sans voir le résultat que j'aimerai.

    j'aimerai en fait voir la répercussion de cette ligne sur l'interface graphique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    joueur.Numeros[k].Tire = true;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <Style x:Key="TextBlockStyle" TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=Tire}" Value="False">
                            <Setter Property="Foreground" Value="Red"></Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=Tire}" Value="True">
                            <Setter Property="Foreground" Value="Yellow"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
    </Style>
    je voudrais donc voir changement par changement mais rien ne fait, tous les changements se font d'un coup après un temps d'attente.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    normal, le rafraichissement est fait par une méthode en .net, une seule méthode peut etre exécutée en même temps, donc tant que c'est pas sorti de la tienne ca ne peut rien faire d'autre

    il faut un thread ou plus simple un timer
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Si j'ai bien compris, ton binding ne se met pas à jour en temps réel ?

    Est ce que tu implémente bien INotifyPropertyChanged et que tu lances bien les events pour informer ta vue ?
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Par défaut
    Merci, j'ai réussi avec un Thread comme ceci

    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
     
    private void Button_Click(object sender, RoutedEventArgs e)
            {
                tirages = readerXml.GetUncheckedTirages();
                joueur = new Joueur();
                tirage = new Tirage();
     
                ProgBar.Value = 0;
                ProgBar.Minimum = 0;
                ProgBar.Maximum = joueurs.Count() * tirages.Count() * 36;
     
     
                i = j = k = l = 0;
     
                th = new Thread(new ThreadStart(Verification));
                th.Start();
            }
    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
     
    void Verification()
            {
                for (int i = 0; i < tirages.Count(); i++)
                {
                    for (int j = 0; j < joueurs.Count(); j++)
                    {
                        joueur = joueurs[j];
                        tirage = tirages[i];
     
                        for (int k = 0; k < 6; k++)
                        {
                            for (int l = 0; l < 6; l++)
                            {
                                if (joueur.Numeros[k].Numero == tirage.Numeros[l].Numero)
                                {
                                    joueur.Numeros[k].Tire = true;
                                    Thread.Sleep(250);
                                }
                                ProgBar.Value += 1; //Erreur ICI
                            }
                        }
                    }
                    tirage.Verifie = true;
                    readerXml.UpdateTirage(tirage);
                }
                if (tirages.Count() > 0)
                {
                    readerXml.UpdateAllJoueurs(joueurs);
                }
                th.Interrupt();
            }
    Par contre j'ai une erreur au niveau de la ligne
    effectivement il me dit que je ne peux pas modifier la Valeur de la progressBar car elle appartient au Thred principal, mais comment est-t-il possible de pouvoir contourner cette restriction?

    Merci

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Impossible, tu ne peux modifier l'UI que depuis le thread courant. Si j'ai bien compris, tu veux rafraichir l'UI en temps réel, je repose donc ma question : As tu bindé tes propriétés et notifient elles leur changement ?

    C'est le meilleur moyen de rafraichir une vue. (Je rappelle que la vue ne doit pas contenir de traitement métier avec lesquels elle n'a aucun lien)
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    if ctrl.invokerequired => ctr.invoke(délégué (ou new action<t>))

    ctrl.invoke permet de demander au controle d'exécuter le code sur son thread et donc de rafraichir l'ui alors qu'on est à l'origine sur un autre thread



    avec INotity modifier une propriété depuis un autre thread risque de poser le même soucis, sauf qu'en plus on a pas le moyen de retrouver le thread d'UI sur la classe (sauf via openforms(0).invoke éventuellement mais c'est pas super propre je trouve)
    en wpf, en héritant de dependencyObject on a les notifications et le dispatcher sur l'objet
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. [2005] Deux requêtes SQL avec un délai entre les deux
    Par janlouk dans le forum Développement
    Réponses: 4
    Dernier message: 31/12/2014, 15h10
  2. [68000] Différence entre les instructions de décalage et DIVU -MULU
    Par autoin dans le forum Autres architectures
    Réponses: 7
    Dernier message: 21/02/2011, 12h14
  3. Réponses: 0
    Dernier message: 23/07/2009, 15h45
  4. Réponses: 4
    Dernier message: 13/06/2007, 09h45
  5. [RegEx] Preg_replace avec une requête entre les remplacements
    Par sox83 dans le forum Langage
    Réponses: 6
    Dernier message: 16/12/2005, 18h12

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