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 :

Le Sleep ne bloque pas l'arrêt du service


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Par défaut Le Sleep ne bloque pas l'arrêt du service
    Bonjour,

    j'ai développé un petit service qui, sans rentrer dans les détails, fait quelques actions puis se met en veille pendant 10 minutes grâce à un Sleep(600000);
    Je pensais que si j'essayais d'arrêter le service pendant qu'il est en veille, le Sleep empêcherait celui ci de s'arrêter. Mais ce n'est pas le cas, le service s'arrête aussitôt.
    Je trouve ça bizarre, c'est comme si le processus était killé, le reste des instructions n'étant pas exécutées.
    Ce qui m'amène à me demander si le service se termine proprement...

    Est ce que quelqu'un a un avis la dessus?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Par défaut
    Je précise quand même que tout se passe dans la fonction ServiceMain

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
    {
         //quelques instructions
         ...
         ...
         Sleep(600000);
         ...
         //encore des instructions
         ...
    }

  3. #3
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    En toute logique, ce qu'il se passe, c'est que la demande de kill est transmise (probablement avec un signal) malgré le sleep.

    J'avoue que je ne connais pas assez l'API win32, mais je pense que c'ets une piste à suivre.

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    La fonction Sleep n'est pas bloquante. Elle ne fait que rendre la main au processeur qui "endort" l'application. Celui-ci viendra la réveiller une fois le délai écoulé.

    Pour être certain que ton programme se quitte proprement il faut gérer l'évènement SERVICE_CONTROL_STOP et libérer les ressources.

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par moldavi Voir le message
    La fonction Sleep n'est pas bloquante.
    Bah si, justement : elle bloque/suspend le thread courant…

  6. #6
    la_tupac
    Invité(e)
    Par défaut
    La fonction Sleep n'est pas bloquante. Elle ne fait que rendre la main au processeur qui "endort" l'application. Celui-ci viendra la réveiller une fois le délai écoulé.
    J'ai peut-être mal compris, mais c'est bien ça qu'il voulait. Mais apparament le service doit générer un exception... Sleep est-il correctement géré pas l'api Win32 (pareil je ne suis pas calé). Mon conseil: essaye de débuguer ou vérifie que les instruction après Sleep sont bien effectuées ...

    ps: renseigne-toi, il doit y avoir une autre methode de sleep pour win32 (c'est vieux Sleep

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour à tous.

    Lorsque je dis que la fonction Sleep n'est pas bloquante, c'est qu'elle ne mobilise pas le processeur. Bien sûr qu'elle bloque le programme au niveau du code, mais pas au sens de l'application gérée par le processeur. Un service n'a pas de boucle de message comme une interface graphique, la gestion des deux sous windows est différente.

    Faîtes une boucle while(true); et vous comprendrez la différence avec un Sleep.

    Citation Envoyé par Steph_ng8 Voir le message
    Bah si, justement : elle bloque/suspend le thread courant…
    Confère ci-dessus. La question n'est pas de savoir si le thread est bloqué/suspendu, mais pourquoi il peut-être arrêter lorsqu'il est dans un Sleep. Et là c'est surtout une question de fonctionnement des services windows qui n'a rien à voir avec une application graphique. Un service que l'on essaie d'arrêter avec la console adéquate, parfois ne s'arrête pas.

  8. #8
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Exact, Sleep ne bloque pas les signaux reçus.
    D'ailleurs, aucune fonction ne le fait.

    Il faut gérer manuellement les signaux pour avoir un contrôle fin dessus.
    Par exemple, sous UNIX, pour ignorer le signal d'interruption (Ctrl + C) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <csignal>
     
    signal(SIGINT, SIG_IGN);
    On peut également définir un gestionnaire de signaux afin de faire exécuter du code particulier (paix à son âme…) lorsqu'un signal donné est intercepté.

    Il y a certainement un moyen similaire de le faire sous Windows, mais je ne connais pas non plus très bien l'API win32.
    Donc je ne peux pas t'aider plus.

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

Discussions similaires

  1. [CSemaphore] pourquoi ca me bloque pas ?
    Par ZaaN dans le forum MFC
    Réponses: 6
    Dernier message: 16/03/2007, 09h37
  2. Réponses: 6
    Dernier message: 13/04/2006, 15h54
  3. Réponses: 8
    Dernier message: 25/11/2005, 18h38
  4. time.sleep() ne fonctionne pas comme souhaité
    Par Olivier_ dans le forum Général Python
    Réponses: 3
    Dernier message: 19/11/2005, 01h46
  5. [Thread] PB Thread.sleep(1000) marche pas
    Par kliel dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 03/12/2004, 13h47

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