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 :

Mettre en pause une boucle for (algo de tri)


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut Mettre en pause une boucle for (algo de tri)
    Salut !

    J'ai découvert il y a déjà un petit bout de temps, une comparaison d'algorithme de tri : http://m.9gag.com/gag/aPyoG4P
    Je trouve ca vraiment sympa et j'ai donc voulu le refaire en C#, question d'aussi apprendre ces algo.

    Mais me voilà confronté à un "problème", enfin, cela fonctionne, mais j'aimerais avoir le même rendu que sur ce GIF, c'est a dire que l'on puisse voir les étapes de l'algo sur le chart control.

    Je prends l'algo du tri par bulle, deux boucles for : Pour un PC avec 200 éléments cela ce fait instantané ^^ ! Et j'ai donc voulu bloquer ces deux boucles for en mettant un System.Threading.Thread.Sleep(50);, question de voir les étapes.

    Mais forcement, cette ligne de commande bloque complément mon appli, c'est le but du sleep ^^ ! Vous n'avez pas une idée de comment faire ?

    Comment puis-je arriver a voir les étapes de mes algo ?

    Merci

    (Je pense qu'il faudra que je fasse du multi-thread, mais si vous avez autre chose )

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Si t'utilises la dernières version du framework avec async await tu peux exécuter ton tri de façon asynchrone et même suivre la progression : http://blogs.msdn.com/b/dotnet/archi...sync-apis.aspx

    SI t'es sur une ancienne version tu peux faire ça avec un backgroundworker : http://www.codeproject.com/Tips/8331...ogressBar-demo

    Tu peux aussi chronométrer le temps d’exécution de tes tâches avec stopwatch : https://msdn.microsoft.com/fr-fr/lib...vs.110%29.aspx et stocker le temps que met chaque tache pour les afficher par la suite.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    Super merci ! Je vais regarder ca

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    Salut !

    J'ai maintenant deux algo de tri opérationnel, enfin presque : le tri par bulle et le shell sort.

    Bon je n'ai "pas voulu" utiliser le systeme de la 4.5 mais plutot le BackGroundWorker.

    Mais j'ai quelque soucis car j'utilise (pour stopper mon algo et voir le resultat (entre deux swap par exemple)) le System.Threading.Thread.Sleep(20);.
    J'ai vu ceci dans le lien que tu m'avais donné !

    Mais du coup en faisant cela, le shell sort stop mon tri par bulle et vice versa. Et pire encore, le tri par bulle se voit sur mon Chart Control de mon Shell, et le shell sur le chart control de mon tri par bulle oO

    Je pense que cela fait un peu tout crash x) ! Et c'est pour cela que j'ai besoin d'aide, car je suis incapable de le résoudre tout seul.

    J'utilise cette facon (screen) :

    Le refresh de mes charts :
    Nom : 0a525a0c6a.png
Affichages : 752
Taille : 27,9 Ko

    Mes workers et mon clic bouton :
    Nom : ef5840e4ac.png
Affichages : 653
Taille : 11,6 Ko


    Mon algo de tri par bulle (dans un classe)
    Nom : 205db32ba2.png
Affichages : 645
Taille : 12,9 Ko

    Et celui de mon shell (aussi dans une classe)
    Nom : 167f6b224b.png
Affichages : 1135
Taille : 19,2 Ko


    Voila comment j'ai fais, sinon jamais vous ne comprenez pas tout, je peux vous envoyer mon projet par message privé !

    Merci de vos aide !

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Envoie moi ton projet si tu veux, sinon tu peux attendre que le premier tri est terminé pour commencer le deuxième, tu peux savoir si ton backgroundworker a terminé grâce à cet event: https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx

    Sinon tu as la balise code pour mettre tes bouts de code.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    Yop !

    J'ai réussi a contourner le problème, mais je pourrais quand même t'envoyer mon projet si tu veux !

    Oui je sais pour le code, mais l'image allait un petit peu plus vite pour moi ^^

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Citation Envoyé par Naografix Voir le message
    Yop !

    J'ai réussi a contourner le problème, mais je pourrais quand même t'envoyer mon projet si tu veux !

    Oui je sais pour le code, mais l'image allait un petit peu plus vite pour moi ^^
    Je ne sais pas si c'est la dernière version que tu m'a envoyé.

    Et qu'as tu fais pour contourner le problème.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    J'ai creer plusieurs liste a trier et plusieurs background worker pour faire fonctionner tout cela !

  9. #9
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Citation Envoyé par Naografix Voir le message
    J'ai creer plusieurs liste a trier et plusieurs background worker pour faire fonctionner tout cela !
    Je t'ai envoyé ton projet modifier si tu veux mettre la solution ici.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    Yep je suis en train d'essayer, mais ce qui me chagrine c'est que le shell sort est super long par rapport a ce qu'il devrait être.

    J'ai fais les test sans coupure et un par un et aussi sans graphique. Le shell sort pour trier 200 000 éléments met 0.169s de moyenne tandis que le bubble sort met 108s.

    Je pense qu'il faut que je revois ma facon (ou la tienne) de d'afficher les points et te faire une "pause"

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Citation Envoyé par Naografix Voir le message
    Yep je suis en train d'essayer, mais ce qui me chagrine c'est que le shell sort est super long par rapport a ce qu'il devrait être.

    J'ai fais les test sans coupure et un par un et aussi sans graphique. Le shell sort pour trier 200 000 éléments met 0.169s de moyenne tandis que le bubble sort met 108s.

    Je pense qu'il faut que je revois ma facon (ou la tienne) de d'afficher les points et te faire une "pause"
    c'est surement que tu mets trop de thread sleep, sinon tu peux faire le tri 2 fois une fois pour calculer le temps réel mis une autre pour mettre à jour l'affichage, en tout cas avec ma méthode déjà avec 100 élément on voit que la bubble est la plus lente, après ma méthode empêche de gérer un trop gros nombre d'élément.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    Oui oui je parle avec ta méthode, le shell n'est pas aussi rapide qu'il devrait l'être.

    Je pense que je vais faire quelque chose comme (découper les actions) même si je sens que ca va être assez chiant a faire ^^

  13. #13
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Citation Envoyé par Naografix Voir le message
    Oui oui je parle avec ta méthode, le shell n'est pas aussi rapide qu'il devrait l'être.

    Je pense que je vais faire quelque chose comme (découper les actions) même si je sens que ca va être assez chiant a faire ^^
    Le problème c'est qu'il faut prendre en compte le temps du rafraîchissement du graphique aussi, et je pense que faire ça en WPF peut être plus simple je me pencherais dessus en utilisant WPF.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    Dac tu me tiens au courant ! Je vais essayer quelques trucs de mon coté !

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Je t'ai envoyé une version retravaillé où je prend le temps que met chaque algo pour être exécuté et je ramène ça au nombre de changement que j'ai pour chaque algo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     /// <summary>
            /// Calcul le nombre d'itération d'affichage prévu pour l'algorithme de tri passé en paramètre
            /// </summary>
            /// <param name="resultSort">résultat de l'algo de tri (item1 est le temps total mis pour le tri et item 2 les nombres aux différentes étapes de tri)</param>
            /// <param name="maxIteration">est le nombre d'itération de l'algorithme de tri en ayant fait le plus</param>
            /// <param name="iterationPrevu">est le nombre d'itération d'affichage prévu ( le nombre de fois qu'on mettra à jour l'affichage</param>
            /// <returns></returns>
            private decimal CalculIteration(Tuple<long, List<int[]>> resultSort, long maxIteration, decimal iterationPrevu)
            {
                return (decimal)resultSort.Item2.Count / ((decimal)resultSort.Item1 / (decimal)maxIteration * iterationPrevu);
            }
    Donc j'ai un timer qui s’exécute à interval régulier et qui affiche l'itération tel que calculé pour chaque tri.

Discussions similaires

  1. Déclarer et mettre une variable dans une boucle for
    Par xunil2003 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 30/04/2013, 11h55
  2. mettre en pause une boucle while
    Par anthodub dans le forum LabVIEW
    Réponses: 8
    Dernier message: 20/04/2011, 12h27
  3. VB5 Comment mettre en pause une boucle?
    Par geof dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 18/04/2008, 12h08
  4. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 20h05
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

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