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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    Membre expérimenté
    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 : 47
    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
    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

  3. #3
    Membre confirmé
    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
    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
    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

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    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...

  6. #6
    Expert confirmé
    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
    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
    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 : 61
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    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.

  8. #8
    Membre confirmé
    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
    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!

    @+

+ 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