Utilisation d'un Thread avec un Switch

Signaler
Messages postés
27
Date d'inscription
mardi 9 juin 2009
Statut
Membre
Dernière intervention
17 mai 2011
-
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-
Bonjour,

Je fais appelle à vous pour un petit programme en C# que je fais en tant que projet pour ma profession.

Mon projet est un jeux qui utilise beaucoup d'images et de pannel différentes, je voulais savoir comment utiliser un thread pour améliorer la fluidité de mon programme.

Voici un bout du code où les pannel (pnlile01 et plnile02) bougent en fonction des touches directionnelles du clavier.

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Up:
pnlile01.Top += 3;
pnlile02.Top += 3;
pnlBoatBase.Width = 18;
pnlBoatBase.Height = 40;
pnlBoatBase.BackgroundImage = pnlBoatHaut.BackgroundImage;
break;

case Keys.Down:
pnlile01.Top -= 3;
pnlile02.Top -= 3;
pnlBoatBase.Width = 18;
pnlBoatBase.Height = 40;
pnlBoatBase.BackgroundImage = pnlBoatBas.BackgroundImage;
break;

case Keys.Right:
pnlile01.Left -= 3;
pnlile02.Left -= 3;
pnlBoatBase.Width = 43;
pnlBoatBase.Height = 40;
pnlBoatBase.BackgroundImage = pnlBoatDroite.BackgroundImage;
break;

case Keys.Left:
pnlile01.Left += 3;
pnlile02.Left += 3;
pnlBoatBase.Width = 43;
pnlBoatBase.Height = 40;
pnlBoatBase.BackgroundImage = pnlBoatGauche.BackgroundImage;
break;
}
}

Le soucis avec ça c'est que le thread utilise une méthode et je ne peux pas mettre le switch dans celle-ci car il utilise la fonction e.keydown qui ne sera pas dans la methode du thread.

Merci de vos futurs réponses.

2 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut, utiliser un second thread pour juste déplacer des panels ce n'est pas une très bonne idée, on va tomber dans des problèmes de cross-threading.

public partial class Form1 : Form
{
    public Form1( )
    {
        InitializeComponent( );
    }

    protected override void OnKeyDown( KeyEventArgs e )
    {
        //base.OnKeyDown( e );

        Thread t = new Thread( new ParameterizedThreadStart( ThreadFunc ) );
        t.IsBackground = true;
        t.Start( ( Object )e.KeyCode );
    }

    private void ThreadFunc( Object o )
    {
        Keys keyCode = ( Keys )o;

        // Attention ici, si on modifie un contrôle ou une forme,
        // il faudra éviter le cross-threading avec la méthode
        // Control.Invoke ou Control.BeginInvoke.
    }
}
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
Bonsoir,

tout dépend de la complexité des informations affichées, mais si la "form" ne contient que des "panels" qui contiennent une image, alors le plus simple serait de supprimer tous les panels et de surcharger la methode OnPaint de la "form".


C# is amazing, enjoy it!