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 :

Suspend et Resume de Thread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut Suspend et Resume de Thread
    Bonjour,

    J'ai une fenêtre qui possède un thread qui rafraichit l'affichage en fontion de valeurs externes. Etant donné que mon application est multi-fenêtre, je peux avoir beaucoup de thread en parallèle. Pour une question d'optimisation, j'aimerais mettre le thread en pause lorsque ma Form est Deactivate, et le reprendre lorsque ma From est Activated. Voilà mon code :

    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
     
        protected override void OnActivated(EventArgs e)
        {
          base.OnActivated(e);
     
          if(threadUpdateStatus.ThreadState != ThreadState.Running)
            this.threadUpdateStatus.Resume();
        }
     
        protected override void OnDeactivate(EventArgs e)
        {
          base.OnDeactivate(e);
     
          if(threadUpdateStatus.ThreadState == ThreadState.Running)
            this.threadUpdateStatus.Suspend();
        }
    Le problème c'est que ces méthodes sont deprecated, et je ne trouve pas de moyen simple de gérer cela. J'ai trouvé plein de doc pour synchroniser, protéger les ressources, etc.

    Est-ce que quelqu'un peut m'aider, ou me donner un lien ou je peux trouver une solution simple?

    Merci d'avance

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    si tu ne fais rien sur ces fenetres, le thread ne fera pas grand chose, donc ca ne sert pas à grand chose de bloquer le thread

    tu peux aussi sinon modifier la priorité des threads pour les fenetre non visibles plutot que de les arreter, avec les meme evenements qu'actuellement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    comme le dit Sperot, AMHA, ca ne sert pas à grand chose (l'optimisation va plutot la chercher sur le nombre de thread au total pour peut etre eviter les context switch à gogo, plutot que sur des desactivation de ce type), et de plus, je ne pense meme pas que ce soit possible. En winform, le thread ne tourne pas sans arret, il s'arrete des que sa file est vide (enfin s'arrete, non, se bloque plutot en attente d'autres messages).

    Enfin jouer avec des Resume et Suspend sur des threads reste tres dangeureux (c'est pour ca que c'est deprecated surement), imagine que tu suspendes durant un bloc locké, tu peux potentiellement tout bloquer (vu que tu ne sauras jamais ou en un thread que tu veux suspendre).

    Bref, laisse tes threads graphiques tranquilles, et au pire regarde si tu ne peux pas en supprimer certains.

    Bon courage.

  4. #4
    Membre Expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Par défaut
    Surtout, comme dit un peu plus haut : si la fenêtre est inactive, le thread n'auras rien à faire, et tu vas justement perdre du temps à le désactiver, pour le réactiver un peu après.... Alors qu'il n'aurais tout simplement peut être rien fait du tout sans ton intervention

  5. #5
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    En fait, le thread dont je parle n'est pas un thread graphique. C'est un thread complètement indépendant de ma fenêtre qui va modifier les propriétés d'une variable. Ensuite, lorsque ces propriétés sont modifiées, des événements sont lancés pour mettre à jour le GUI...

    Mais je pense passer par une autre solution plutot que suspendre, car en effet, c'est dangereux...

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Comment fonctionne ce thread ? Il ne tourne pas sans arret je suppose. Si tu veux correller ton thread avec ton UI, tu peux essayer de passer par des events (AutoResetEvent par exemple), pour le faire terminer si la form n'est pas affichée, et le relancer quand la form se reaffiche. Tout ca avec une fonction d'idle qui va le gerer le temps que la form est visible. Avec le Pool, c'est faisable sans grosse perte de perf.

    Un petit peu de code, peut etre pour avoir une meilleure idée de ce que tu cherches. =)

  7. #7
    Membre éclairé Avatar de stephane.julien
    Inscrit en
    Septembre 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 342
    Par défaut
    En fait, j'ai un thread dont la méthode associée est une boucle infinie (avec un sleep). Dans cette boucle, je communique avec un serveur de socket et je récupère des variables. Etant donné que je peux avoir plusieurs fenêtres, donc plusieurs threads, j'aimerais minimiser les accès réseau.

    Actuellement, je contourne le problème par une variable booléenne que je modifie dans OnActivated et OnDeactivate, puis dans ma boucle de Thread, je teste cette variable booléenne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        protected override void OnActivated(EventArgs e)
        {
          base.OnActivated(e);
     
          bRefresh = true;
        }
     
        protected override void OnDeactivate(EventArgs e)
        {
          base.OnDeactivate(e);
     
          bRefresh = false;
        }
    La solution que SirJulio propose a l'air bien mais je n'ai pas tout compris... Tu peux m'en dire plus stp?

Discussions similaires

  1. Thread.Suspend() et Thread.Resume()
    Par 3abdssami3 dans le forum C#
    Réponses: 6
    Dernier message: 27/05/2009, 13h56
  2. C# Thread Suspend/Resume
    Par ArnaudDev dans le forum C#
    Réponses: 11
    Dernier message: 12/07/2008, 09h47
  3. suspend et resume sur thread
    Par scob85 dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 20/06/2007, 17h38
  4. [Thread] resume() et suspend() comment faire .
    Par ricardvince dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 12/05/2006, 13h55
  5. [Threads] suspend and resume
    Par el3gans dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 19/09/2005, 20h56

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