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

Mono .NET Discussion :

[Mono][C#] Comment éviter le gel de l'application lors du lancement d'une fonction ?


Sujet :

Mono .NET

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut [Mono][C#] Comment éviter le gel de l'application lors du lancement d'une fonction ?
    Bonjour à tous!
    J'écris une petit alarme qui lance un programme multimédia (MOC) et une fonction pour augmenter progressivement le son; pour se réveiller en douceur .

    Mon problème est le suivant.
    J'utilise System.Diagnostics.Process dans une boucle. Le processus lancé est amixer dont le rôle est de réglé et d'augmenter le son selon une valeur int32 "Niveau".

    Quand cette fonction est lancé, le traitement s'effectue correctement mais ma fenètre gel et je ne peux la récupéré qu'à la fin de la boucle.

    Voici mon code pour la boucle en question (appellé dans une autre fonction):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    protected void UpSound()
        {
            // Variables nécessaires
            int Niveau = 40;
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            // Nom de l'executable à lancer
            proc.StartInfo.FileName = "amixer set PCM";
     
            while ( Niveau <= 95 )
            {
                // Argument supplémentaire
                proc.StartInfo.Arguments = Niveau.ToString();
                proc.Start();
                proc.Close();
                Niveau += 3;
                Thread.Sleep(3000);
            }
        }
    J'aimerais savoir s'il est possible de lancer cette boucle "en arrière plan" sans affecter ma fenètre pour ainsi en garder le contrôle.

    Merci!

    @+

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Ce problème a déjà été abordé dans plusieurs topics (celui-ci par exemple) de ce forum et je suppose que même avec Mono la raison de ce comportement est la même que sous Windows.

    Lorsqu'un traitement lourd est effectué dans le code d'une Form, cela prend du temps sur le thread principal dont le but est l'affichage de cette Form, résultat l'affichage est gelé. La solution, créer un thread dans lequel on exécutera le traitement lourd, afin que le thread principal puisse toujours gérer l'affichage tranquillement
    Pas de questions techniques par MP

  3. #3
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Merci bien StormimOn.
    Rapide en plus!

    Je suis un petit débutant avec les thread...
    Il s'agit de faire comme ceci je présume ?:
    http://faqcsharp.developpez.com/?pag...d#thread_start

    Je tente ça et reviens si j'ai des question

    Merci!
    @+

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut .

    Un possibilité plus simple que le multi threading est de tout simplement faire passer les messages à chaque tours de boucle .

    En Winform :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.DoEvents();
    en GTK#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.RunIteration(false);
    Mono Doc
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par dev01
    Salut .

    Un possibilité plus simple que le multi threading est de tout simplement faire passer les messages à chaque tours de boucle .

    En Winform :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.DoEvents();
    en GTK#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.RunIteration(false);
    Mono Doc
    Fait donc ça, et débrouille toi avec les problèmes de réentrance...
    On ne peut pas faire boire un âne qui n'a pas soif.

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par NicolasG
    Fait donc ça, et débrouille toi avec les problèmes de réentrance...
    qu'est-ce ?

  7. #7
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par smyley
    qu'est-ce ?
    +1

    Justement avec cette méthode on évite tout le pb lié au multi-threading et à l'accès inter-Thread des composants graphique. Il n'y a pas de "réentrance" car 1 seul thread gouverné par des appels de fonctions .

    Il est ou le pb ?
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Le pb c'est qu'avec DoEvents(), on rappelle le mécanisme de gestion des événements avant de finir la méthode.
    On peut se retrouver facilement à entrer dans la même méthode et rappeler DoEvents() et ainsi de suite.

    C'est encore plus amusant quand on a plusieurs méthodes qui appellent DoEvents()...
    On ne peut pas faire boire un âne qui n'a pas soif.

  9. #9
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Citation Envoyé par dev01
    Salut .

    Un possibilité plus simple que le multi threading est de tout simplement faire passer les messages à chaque tours de boucle .

    En Winform :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.DoEvents();
    en GTK#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.RunIteration(false);
    Mono Doc
    Avec cette solution, les performances deviennent vite désastreuse. C'est vrai c'est facile mais à utiliser avec beaucoup de modération et de pertinence .

    Jette un coup d'oeil sur l'article http://jab.developpez.com/tutoriels/...ess/synchrone/

    On y discute de cas de figure qui devrit t'interesser.

  10. #10
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Héhé!

    Je vois que ce post a suscité plein de réaction en mon absence.
    Suite aux recommandations de hier, je m'étais attaqué à la création de mon premier thread. À coup de msdn et de FAQ, j'ai modifié mon code...

    Ça ne marchais pas depuis hier jusqu'à ce que tu poste cette excellent lien Jap!

    Maintenant ça fonctione et vraiment bien en plus!
    Mon Gui ne gèle plus, ma boucle s'effectue tout en douceur en arrière plan...parfait!

    J'aurais 2 petites questions par contre avant de clore le sujet.

    1- Je lance un thread qui effectue le même code que ma fonction plus haut. Lorsque ma boucle se termine, dois-je fermer, tuer le thread ou effectuer une quelquonque opération de sortie ?

    2- Le fait de déléguer beaucoup de processus à plusieurs threads est-il gourmand en mémoire ? Il ne faut pas en abuser ou ( désolé pour l'expression ) "Les thread c'est bon, mangez-en! " ?

    Merci encore une fois à tous de votre aide!

    @+

  11. #11
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Okay merci à NicolasG et Jab des commentaires, j'aurais pris concience de queque chose

    Donc le multi thread est ton ami ... (et les délégués par la même occasion ).
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  12. #12
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par Shaika-Dzari
    1- Je lance un thread qui effectue le même code que ma fonction plus haut. Lorsque ma boucle se termine, dois-je fermer, tuer le thread ou effectuer une quelquonque opération de sortie ?
    Lorsque la fonction d'un thread se termine, il s'arrete tout seul : tu n'as rien à faire de précis. Une action est nécéssaire uniquement si tu souhaites l'arreter ou le suspendre avant la fin de son exécution

    Citation Envoyé par Shaika-Dzari
    2- Le fait de déléguer beaucoup de processus à plusieurs threads est-il gourmand en mémoire ? Il ne faut pas en abuser ou ( désolé pour l'expression ) "Les thread c'est bon, mangez-en! " ?
    Les thread c'est bon, mais avec modération : avoir trop de thread lancés en même temps peut ralentir la machine. Pour une utilisation personnelle celà ne se sens pas vraiment mais on voit surtout l'impact sur un serveur, où il y a un réel ralantissement lorsqu'il y a trop de threads

  13. #13
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Merci Smyley pour ces dernières précisions!

    Résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/01/2012, 16h57
  2. Réponses: 1
    Dernier message: 13/05/2009, 03h48
  3. Réponses: 7
    Dernier message: 04/05/2007, 12h20
  4. Réponses: 1
    Dernier message: 03/05/2007, 07h49
  5. Réponses: 1
    Dernier message: 02/05/2007, 15h08

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