Temps de calcul processeur

Résolu
Manu94600 Messages postés 107 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 20 février 2008 - 20 janv. 2006 à 09:00
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 - 20 janv. 2006 à 12:42
Salut à tous,

Voilà je suis en train de faire un programme en C# qui calcul toutes les posibilités dans un parcours labyrinthe. Et mon interfase freeze pendant ce tps de calcul.

Je voudrais savoir s'il y avait un moyen pour faire une petite fenetre de loading ??

J'espère bcp que vous pourrez m'aider.

@+

Manu

16 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
20 janv. 2006 à 10:55
il faut donc attendre la fin de ton thread pour continuer :

Thread newProcessus = new Thread(new ThreadStart(monLaby.CalculParcours));
newProcessus.Start();

while( newProcessus.IsAlive)
Application.DoEvents();

monLaby.GetParcours();

Sébastien FERRAND
[MVP Visual C#]
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 janv. 2006 à 11:38
Il faut juste remplacer les lignes que seb t'as donné par le Join.
Il permet simplement d'attenre la fin du Thread sur lequel tu appeles la méthode.



Mx
MVP C#
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
20 janv. 2006 à 09:30
exécute ce calcul dans un autre thread

Sébastien FERRAND
[MVP Visual C#]
0
Manu94600 Messages postés 107 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 20 février 2008
20 janv. 2006 à 09:37
Ce calcul se fait via une classe qui est appelé dans la form.

Pourrais tu me donner un exemple vite fait pour tester je connais pas trop les threads

Manu
0

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

Posez votre question
Manu94600 Messages postés 107 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 20 février 2008
20 janv. 2006 à 10:36
J'ai essayé d'utiliser un thread mais je sais pas si je l'utilise bien.

Alors j'explique :
J'ai un bouton et ce bouton il crée l'objet labyrinthe et commence le calcul.
et dans l'interfase je devrais ensuite avoir le labyrinthe et le parcours effectuer

Donc le voici le code que j'ai mis dans le bouton

monLaby = new Laby();

Thread newProcessus = new Thread(new ThreadStart(monLaby.CalculParcours));
newProcessus.Start();

je fais juste un monLaby.GetParcours(); pour afficher le parcours.

Et donc mon probleme c'est que le processus n'a pas encore fini que j'essai d'afficher le parcours.

Manu
0
Manu94600 Messages postés 107 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 20 février 2008
20 janv. 2006 à 11:11
Merci pour ta réponse super rapide sebmafate ;).

J'aurais une autre question à te poser, je voudais maintenant faire une progressBar.
En fait j'aimerai que pendant le tps qu'il calcul, qu'il affiche une progressbar dans un autre fenetre et à la fin du traitement il ferme automatiquement cette fenetre.

Pour ce qui est d'affichier la fenetre c'est bon et de la fermer aussi :).
Mais c'est pour la progressBar.

Alors j'ai eu une premiere idée, c'etait de calculer le tps de traitement 1 première fois, ensuite de faire a chaque fois une moyenne des temps. Mais je sais pas si c'est la meilleur solution ??

Merci encore pour ta réponse ;).

Manu
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 janv. 2006 à 11:18
>> while( newProcessus.IsAlive)
>> Application.DoEvents();

Question : Il ne faudrait pas plutot utiliser newProcessus.Join(); ? Ou alors ca agirait pas comme prévu ?
Mx
MVP C#
0
Manu94600 Messages postés 107 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 20 février 2008
20 janv. 2006 à 11:21
Pour mon application ca marche bien :)

Manu
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
20 janv. 2006 à 11:31
oui, le Join() est plus propre... mais je l'oublie toujours celui-ci

Sébastien FERRAND
[MVP Visual C#]
0
Manu94600 Messages postés 107 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 20 février 2008
20 janv. 2006 à 11:35
Ca sert à quoi join() ??

Et il faut le placer où ??

Manu
0
Manu94600 Messages postés 107 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 20 février 2008
20 janv. 2006 à 11:46
Je sais pas si c'est bon car en faisant :

Form f = new FormLoading();

f.Show();

Thread newProcessus = new Thread(new ThreadStart(monLaby.CalculParcours));
newProcessus.Start();

newProcessus.Join();

f.Close();

monLaby.GetParcours();

En faisant ça, j'ai la fenetre de loading qui se met au dessus et les 2 fenetres se freezent. Quand le calcul est terminé, il ferme la fenetre de loading alors qu'il l'a pas bien affiché du au freeze.

Manu
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 janv. 2006 à 11:51
Ah en effet, ca va bloquer ton autre Thread :/
Il faudrait peut-etre utiliser AutoResetEvent alors.

Sinon, garde la solution de Seb, si elle fonctionne bien, autant faire comme ca.
Le Threading est parfois tres complexe ^^




Mx
MVP C#
0
Manu94600 Messages postés 107 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 20 février 2008
20 janv. 2006 à 11:54
Oki merci les gars ;).

Et pour ma progress bar personne pourrait me donner un petit indice ??

Manu
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 janv. 2006 à 11:57
Pour la progressbar, il faut reussir a evaluer le temps que ta méthode va prendre, et l'incrementer a chaque iteration d'une boucle. J'ai pas trop d'idées de comment faire reellement vu que je connais pas ton code.




Mx
MVP C#
0
Manu94600 Messages postés 107 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 20 février 2008
20 janv. 2006 à 12:11
Bah mon code, il est assez long donc je vais expliquer vite fait le principe.

Le parcours est constitué de 50 portes a passé.
Il faut qu'il y ai 1 et une seul porte à passer à chaque porte passer.

Je m'explique :) :
Je suis a la porte 1, il faut que je trouve qu'une seul porte pour continuer, et quand j'en trouve une et une seul je la comptabilise. Et je me place à la 2eme porte. etc jusqu'à sortir à la porte 50.

Donc j'ai une boucle for(int i=0 ; i<50;i++)

Et donc le début de la progress bar est symbolisé par le passage de la porte 0 et la fin c'est quand il for de la boucle à la 50 eme porte

Manu
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 janv. 2006 à 12:42
Bon, hé beh je vais tenter de te repondre, mais je te dirais peut-etre une betise parce que j'ai jamais fais ce genre de chose.
Prenons une ProgressBar avec une valeur de 100 pour sa propriété Maximum. S'il y a 50 Portes, on dira qu'il faut augmenter la valeur de la progressbar de 2%, soit mettre sa propriété Step a 2
Et a la derniere ligne de ta boucle for, il va falloir appeler la méthode PerformStep() de ta ProgressBar.

Maintenant, le "probleme", c'est que tu vas appeler une méthode d'un objet appartenant a ton Thread principal depuis un autre thread, ce qui est "illegal". Pour ca, il faut utiliser un appel Asynchrone.
Donc je te ramene a ce tutorial, qui n'est pas compliqué et qui t'expliquera comment acceder proprement a un objet appartenant a un autre Thread


Mx
MVP C#
0
Rejoignez-nous