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 :

Bloquer une boucle?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut Bloquer une boucle?
    Bonjour à tous.
    Dans mon projet, je dois réaliser une "simulation". Il s'agit de calculs réalisés dans un timer qui fait bouger des pions (cercle dessinés avec ovalshape).

    Donc pendant genre 10 minutes ma boucle va devoir effectuer les calculs pour déplacer les pions.

    Mais le joueur doit pouvoir faire des actiosn en cliquant sur des boutons qui influent sur cette simulation(et si il fait rien ça fait tout seul)

    Actions possibles: Augmenter la vitesse des pions (changer dans le timer), leur donner des consignes à effectuer sur les actions suivantes.

    Si je laisse le tout s'executer dans une boucle alors quand je vais cliquer sur un bouton ça va freezer l'écran non?
    Si j'utilise le background worker alors je pourrais pas faire influer directement les actions du joueur sans interrompre la boucle si?
    Ou si c'est le cas est-il possible d'avoir une explication ou une idée à ce sujet ? Je pense en effet avoir mal compris ce principe du background worker malgré tous les tuto disponibles. Mon code s'executerait à part mais si la carte et les pions sont sur le premier thread alors dans ma boucle je ne pourrais pas les faire bouger? c'est ça que j'arrive pas à comprendre avec cette méthode en fait.

    Tout autre solution est la bienvenue !

    Merci

  2. #2
    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
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut
    Alors je met ma simulation dans le background worker (donc un thread secondaire ?) puis je modifie la position des joueurs grace à des délégués ?(les joueurs seraient dans le thread principal donc).

    Merci !

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut
    Mon problème:
    Je n'arrive pas à intégrer le timer dans mon second thread. Comment faire? Il faut utiliser System.windows.forms.Timer ou plutot System.Threading.timer ?

    Si je fais:
    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
     
    static void Program(...)          //C'est le début du match:
                Thread th = new Thread(DebuterSimu);
                th.Start();//On lance le thread
            }
            static void DebuterSimu()
            {
                System.Windows.Forms.Timer Time = new System.Windows.Forms.Timer();
                Time.Interval = 60;
                Time.Tick += new EventHandler(match.timer1_Tick);
                Time.Enabled = true;
     
            }
    public void timer1_Tick(object sender, EventArgs e)
            {
            }
    Problème dans ce code lors de définition de l'événement Tick


    En fait faut-il créer le TImer dans le thread secondaire puis mettre sa propriété à enabled ? (il est possible de prendre une fonction qui ne se trouve pas dans DebuterSimu pour le TIck ?)
    Ou alors faut-il créer un thread à partir du timer avec quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Timer(timer1_Tick,"", 24000,60);
    Merci

  5. #5
    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
    un timer dans un thread ??
    explique ce que tu veux faire car tu es sur la mauvaise piste ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut
    Bah pour pouvoir bouger mes "pions" il faut modifier sa position progressivement genre une petite vingtaine de fois pas seconde histoire d'avoir un déplacement fluide.
    C'est pourquoi j'aimerais modifier sa position genre tous les 60ms, et je pensais utiliser un timer.

    En fait tous les 60 ms je comptais refaire tous les calculs qui aboutissent au déplacement de mes pions.
    Mais je dois faire les calculs dans un autre thread pour que l'utilisateur puisse continuer à cliquer sur les boutons pour intéragir et influencer la simulation.

    Sinon vu qu'une "phase" dure environ 20 secondes(les actions de l'utilisateur sont effectives pou les phases suivantes), on pourrait mettre le timer dans le thread principal et dans le thread secondaire on calcule toutes positions des pions qu'on stocke dans un array par exemple, et le timer les exécute à sa vitesse.
    Un problème pourrait survenir si le timer va plus vite que le thread secondaire cependant, même si théoriquement ya que 10 pions à gérer quoi. Le problème est qu'on ne pourrait pas modifier la valeur de l'array sauf avec des delegate mais si on modifie l'array en meme temps que l'autre thread l'utilise ça risque de ne pas marcher si?

    Sinon j'avais trouvé ça: http://www.devasp.net/net/articles/display/698.html
    ça semble correspondre en partie à ce que je cherche non? Dans ce cas à quel moment je peux changer la position de mes pions.


    J'espère que mon problème est compréhensible :s.

  7. #7
    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
    un timer devrait suffire je pense
    calculer un point doit prendre quelques centaines de nanosecondes dans le pire des cas donc pas besoin de thread

    et l'interface sera moins fluide si dans ton timer le code prend plus de 250ms à s'exécuter

    pour voir le temps d'exécution de plusieurs lignes de code, on peut utiliser un chronomètre : system.diagnostics.stopwatch
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/03/2014, 09h20
  2. bloquer sur une Boucle avec C#
    Par badinjala dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 22/03/2012, 17h36
  3. Réponses: 19
    Dernier message: 19/02/2011, 20h26
  4. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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