Boucler sans planter [Résolu]

Signaler
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010
-
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010
-
Bonjour, comment boucler sans planter ? :D
J'ai un ptit logiciel ou l'ont met un chiffre pour la boucle et a partir de 500 il commence a avoir des problemes d'afichage si l'ont passe du bureau au logiciel par exemple.
Que faut il faire pour que l'application ne plante pas ?
Merci.

21 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Voila un exemple reduit a son minimum (sans l'initialisation des Controls)
Tu n'as plus qu'a faire ton traitement long dans la boucle

<hr />public
partial
class
Form1 :
Form
{

   private
delegate
void
IncrementProgressBarDelegate(
int value);

   private
IncrementProgressBarDelegate IncrementProgressBar;

   public Form1()
   {
      InitializeComponent();

      this.progressBar1.Maximum = 30000;

      this.IncrementProgressBar =
new
IncrementProgressBarDelegate(Increment);
   }

   public
void Increment(
int value)
   {

      this.progressBar1.Increment(value);
    }

   private
void button1_Click(
object sender,
EventArgs e)
   {

      Thread t =
new
Thread(
new
ThreadStart(ThreadMethod));
      t.Start();
   }

   public
void ThreadMethod()
   {

      for(
int i = 0; i < 10000; i++)
      {

         this.Invoke(
this.IncrementProgressBar, 1);
      }
   }
}
<hr />

Mx
MVP C# 
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Ah ben je viens de tester sur mon autre tour sa fonctionne je peux bouger la form et passer d'une fenetre à la form sans soucis.
Tant mieux mais ca veux dire que mon PC qui me sert a programmer est bon a etre formatter :s ou une reinstallation des framework ?
En tout merci tout est bon et je vais pouvoir continuer mon initiation dans les Thread.
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
La reinstallation de framework ne servira a rien je pense. Et je vois pas trop pourquoi ca agit comme ca sur ton PC
Ca reste bizarre comme histoire

Mx
MVP C# 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Salut,
Si ton opération prend un certain temps, il faut la faire tourner dans un thread différent. Regardes dans le namespace System.Threading et plus précisément la class Thread.

<hr />
-Blog-
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Merci je vais regarder sa de plus pres.
(je laisse le post ouvert pour le moment).
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Re,
Avec les thread il apparement il faut une fonction qu'avec des variables moi j'ai un composant( progressbar), je recup sa valeur a un moment donné. et le Thread n'aime pas apparmement, il dit :

Opération inter-threads non valide : le contrôle 'progressBar1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

Je peux pas passer a travers sa?

Merci.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Salut,
Oui, c'est ce qu'on appelle une opération cross-threading, tu trouveras un excellent tuto, fait par Mx, ici

<hr />
-Blog-
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Bon je t'avourais que j'y comprend rien :) donc je crois que jvais mettre sa de coté pour le moment.
j'ai progressBar1.Minimum = 0;
dans ma fonction et a cause de sa je ne peux continuer du a l'erreur du post precedent.
Et je ne vois vraiment pas commment recuperer la valeur sans tout passer en parametre :s
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Le truc, c'est que si tu es dans un autre thread que celui qui a crée ton Control, tu ne peux pas accéder à ce Control, sinon tu vas avoir l'erreur de cross-threading que tu as indiqué plus haut.
L'idée c'est d'utiliser les méthodes Invoke/BeginInvoke. Le tuto dont je t'ai donné le lien plus haut est vraiment bien fait et tout y est vraiment bien expliqué, prends le temps de le lire et de le comprendre :-)

<hr />
-Blog-
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Re bonjour,

Alors je continue dans l'apprentissage du Thread qui donc est censé ne plus me faire planté les appli et ne plus avoir de probleme d'affichage et je ni arrive pas :s.

J'ai fais un code tout simple d'une boucle et quand je vais de mon appli vers le bureau par exemple quand je retourne a mon appli bah j'ai plus d'affichage.

private
Thread t;

private
delegate
void
ChargeBarre();

public
void barre()
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 100000;

int i = 0;

while (i < progressBar1.Maximum)
{
progressBar1.Value = i;
i++;
}
}

private
void button1_Click(
object sender,
EventArgs e)
{
t =
new
Thread(
new
ThreadStart(ThreadMethod));
t.Start();
barre();
}

private
void ThreadMethod()
{

this.Invoke(
new
ChargeBarre(barre));

MessageBox.Show(
"Invoke terminé");
}

Voili mon code. Donc soit j'ai zapper un truc soit le thread n'empehce pas le le probleme d'affichage.
Mais la je galere.
Si l'on peu m'aider merci.
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Salut,

J'avais fait une source qui prenait l'exemple avec un ProgressBar, ici

Mx
MVP C# 
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Merci je l'avais vue cette source mais il me semble que j'avais pas tout compris enfin je navigue entre plein de source et je voulais essayer de faire quelque chose de simple avec un boucle dans un thread pour comprendre d'ou mon morceau de code car il y a quelque source qui traine sur le net mais toutte differente et je n'arrive pas a coder quelque chose de simple ne plantant pas :s
Donc voila comment faire une form avec aucun affichage dessus et un for de 0 a 10 000 et que lorsque je passe du prog au bureau et du bureau vers le prog je retrouve la form bien afficher.
La dans mon tit code je crée bien un thread que je demarre sur le clique bouton, sa fonctionne mais j'ai toujours un prbleme d'affichage :s
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Merci beaucoup :). Cela dis la progressBar reapparait tout bien. mais le bouton non :s
Donc j'ai un probleme de PC ? ou alors il faut que tout les element soit dans des thread differents ?
La Form est deja dans un thread, la progressbar aussi il faut mettre les bouton et autre element aussi ?
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Tout ce qui appartient a l'interface graphique est dans la meme Thread, qui est le Thread principal.
Tu ne dois pas ajouter de nouveaux Controls a ta form depuis un autre Thread.

C'est assez bizarre que tu aies un probleme de bouton, normalement ca devrait s'afficher. Tu as aussi essayé en lancant l'appli sans debuggage ? (CTRL+F5 dans Visual Studio)

Mx
MVP C# 
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Oui j'ai essayer :

Voila j'ai bien la progresseBar mais pas le reste
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Il doit y avoir autre chose dans ton code.
Ouvre un nouveau projet sous VS, et ajoute a la Form1 générée un bouton et un ProgressBar.
Copie-colle mon code dans le fichier Form1.cs, et regarde si tu as toujours ce probleme de bouton.

Mx
MVP C# 
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Nan bah c'est toujours pareil des soucis d'affichage j'ai meme fait publier pour tout installer c'est pareil. Sa peut venir de mon PC ?
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
C'est difficile a dire :/
T'as pas possibilité de tester sur un autre PC ?
T'as pas de probleme pour bouger la fenetre pendant le traitement ?

Mx
MVP C# 
Messages postés
361
Date d'inscription
jeudi 5 février 2004
Statut
Membre
Dernière intervention
1 octobre 2010

Euh si j'ai une deuxieme tour je vais allez la brancher.
Sinon la fenetre Je ne peu pas la bouger quand la progressbar est démarrer. et lorsque je vais sur le bureau et que je reviens dessus elle ne s'affiche meme plus :s jusqu a ce qu'il ai fini le traitement.
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Ca ne devrait absolument pas agir comme ca, le but d'effectuer ton traitement dans un autre thread est justement de  laisser l'interface graphique reactive. Meme s'il n'y avait pas de progressbar a incrementer. (donc la fenetre bougerait sans probleme, le bouton s'afficherait correctement, etc).

Mx
MVP C#