Boucler sans planter

Résolu
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010 - 2 mai 2007 à 10:34
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010 - 11 juin 2007 à 13:45
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

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 juin 2007 à 11:45
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# 
3
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
11 juin 2007 à 13:41
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.
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 juin 2007 à 13:44
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# 
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 mai 2007 à 10:39
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-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
2 mai 2007 à 10:40
Merci je vais regarder sa de plus pres.
(je laisse le post ouvert pour le moment).
0
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
2 mai 2007 à 11:15
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.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 mai 2007 à 11:33
Salut,
Oui, c'est ce qu'on appelle une opération cross-threading, tu trouveras un excellent tuto, fait par Mx, ici

<hr />
-Blog-
0
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
2 mai 2007 à 12:21
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 mai 2007 à 14:04
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-
0
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
6 juin 2007 à 21:41
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.
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 juin 2007 à 11:12
Salut,

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

Mx
MVP C# 
0
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
11 juin 2007 à 11:19
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
0
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
11 juin 2007 à 11:57
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 ?
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 juin 2007 à 12:25
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# 
0
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
11 juin 2007 à 12:30
Oui j'ai essayer :

Voila j'ai bien la progresseBar mais pas le reste
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 juin 2007 à 12:33
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# 
0
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
11 juin 2007 à 13:06
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 ?
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 juin 2007 à 13:09
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# 
0
cs_wally88 Messages postés 361 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 1 octobre 2010
11 juin 2007 à 13:13
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.
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
11 juin 2007 à 13:34
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# 
0
Rejoignez-nous