Timer & service

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 4 nov. 2006 à 13:16
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 4 nov. 2006 à 14:03
Bonjour à tous.

Voici mon problème,

J'ai crée un timer dans mon service, mais celui-ci ne fonctionne pas (je suis certain que c'est le timer car j'ai tester mon service sans et il va impec). Il y à t-il quelque chose que j'ai oublier?

Il devrai inscrire test tout les minute ds un fichier log à la racine, mais ne le fait pas :s

Voici le code (en gras : ce qui concerne le timer) :

#include <windows.h>
#include <stdio.h>


SERVICE_STATUS ssService;
SERVICE_STATUS_HANDLE sshServiceHandle;


void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ShutD1HCtrlHandler(DWORD Opcode);
void CALLBACK TimerProc(HWND hwnd,UINT uiMsg,UINT uiIdEvant,DWORD dwTime);


/*BOOL boR = 1;*/
UINT_PTR uiptId;


/* TASK : point d'entré du programme.*/
int WINAPI WinMain(HINSTANCE hinst,  HINSTANCE a, PSTR b, int v){
    SERVICE_TABLE_ENTRY steDispatche;
   
    steDispatche.lpServiceName = "SHUTD"; /* Nom du service. */
    steDispatche.lpServiceProc = ServiceMain; /* Pointeur sur la fonction "main" du service. */
   
    /* On démarre le service. */
    if(!StartServiceCtrlDispatcher(&steDispatche)){
        OutputDebugStringA("\n SetServiceStatus (fct : ShutD1HCtrlHandler) fail !");
        return;
    }
}


/* TASK : Fonction main du service. (Mettre les instructions à effectuer).*/
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv){
    
    
    ssService.dwServiceType        = SERVICE_WIN32;
    ssService.dwCurrentState       = SERVICE_START_PENDING;
    ssService.dwControlsAccepted   = SERVICE_ACCEPT_STOP;
    ssService.dwWin32ExitCode      = 0;
    ssService.dwServiceSpecificExitCode = 0;
    ssService.dwCheckPoint         = 0;
    ssService.dwWaitHint           = 0;


    /* On crée le handle du service. Ici c'est le handle du programme de control du service (ici : ShutD1HCtrlHandler). */
    sshServiceHandle = RegisterServiceCtrlHandler("SHUTD",ShutD1HCtrlHandler);
    if (sshServiceHandle == (SERVICE_STATUS_HANDLE)0)return;


    /* Après avoir démarré le service, on change sont statut pour l'éxécuter. */
    ssService.dwCurrentState       = SERVICE_RUNNING;
    ssService.dwCheckPoint         = 0;
    ssService.dwWaitHint           = 0;
    if (!SetServiceStatus (sshServiceHandle, &ssService)){
         OutputDebugStringA("\n SetServiceStatus (fct : ServiceMain) fail !");
         return;
    }
    /*FILE * f;
   
    while(boR){
    f = fopen("c:\\log.txt","a+");
    fprintf(f,"test\n");
    fclose(f);
    }*/
        uiptId SetTimer(NULL,0,6000,(TIMERPROC)TimerProc); /* Si hwnd NULL, l'id du timer est ignoré (2ième paramètre).
                                                          * Si Hwnd = NULL, SetTimer renvoie un id de type UINT_PTR, qui peut être utilisé
                                                          * pour identifier le timer. Et peu être employé dans KillTime().
                                                          */
}


/* TASK : Gère le changement de statut du service. */
void WINAPI ShutD1HCtrlHandler(DWORD Opcode){
     switch(Opcode){
          case SERVICE_CONTROL_PAUSE : ssService.dwCurrentState = SERVICE_PAUSED;
          break;
          case SERVICE_CONTROL_CONTINUE : ssService.dwCurrentState = SERVICE_RUNNING;
          break;
          case SERVICE_CONTROL_STOP : {
                                          ssService.dwWin32ExitCode = 0;
                                          ssService.dwCurrentState = SERVICE_STOPPED;
                                          ssService.dwCheckPoint = 0;
                                          ssService.dwWaitHint = 0;
                                         
                                          //boR = 0;
                                          KillTimer(NULL,uiptId);
                                      }
          break;
          case SERVICE_CONTROL_INTERROGATE :
          break;
     }
    
     if(!SetServiceStatus(sshServiceHandle,&ssService)){
         OutputDebugStringA("\n SetServiceStatus (fct : ShutD1HCtrlHandler) fail !");
         return;
     }
}


/* TASK : Fonction du timer. */


void CALLBACK TimerProc(HWND hwnd,UINT uiMsg,UINT uiIdEvant,DWORD dwTime){
    FILE * f;
    f = fopen("c:\\log.txt","a+");
    fprintf(f,"test\n");
    fclose(f);
}

Merci d'avance

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]

10 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 nov. 2006 à 13:29
Quelle est la valeur retournée par SetTimer?
Es-tu sur que tu n'entres pas dans TimerProc?
Petit truc qui n'a rien a voir: pourquoi ce cas (TIMERPROC)?
Il suffit de bien déclarer ton TimerProc, et ce cast inutile pourra être enlevé

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
4 nov. 2006 à 13:34
L'ennui vecchio c'est que je ne sais vérifier la valeur retournée , car je ne peut rien afficher dutout :s car mes msgbox ne s'affiche pas sur le mm "bureau" :s

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
4 nov. 2006 à 13:34
Salut,

Y'a pas de boucle de message dans un service ? parceque pour faire fonctionner un timer, il en faut une.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
4 nov. 2006 à 13:38
Si tu veu parler d'un WM_TIMER non, car pas de fenêtre, pas de WM_TIMER

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 nov. 2006 à 13:49
Je sais pas comment marchent les services, mais la c'est normal que le programme se termine directement?
Parce que là, la fonction ServiceMain se termine et le programme aussi.
C'est peut être effectivment à toi de mettre ta boucle des messages
Et si une simple boucle te suffit, pourquoi ne pas utiliser simplement la fonction Sleep au lieu d'eun timer?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 nov. 2006 à 13:53
Par exemple dans ce code, je vois un WaitForSingleObject à la fin de ServiceMain. Il te faut un truc dans ce genre la pour éviter que le service ne se termine tout de suite.
La solution suivante me semble aussi convenable:

FILE * f;
while(boR){
    f = fopen("c:\\log.txt","a+");
    fprintf(f,"test\n");
    fclose(f);
    Sleep(...);
}

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
4 nov. 2006 à 13:53
Oui c'est normal. Oui c'est ce que je vien de faire, une boucle while(boOk) et quand on stop le service boOk passe à 0 et le test s'arrete. Mais bon je trouve cela moin joli avec un Sleep lol. Enfin bon je fait le Sleep pour qu'il soit opérationnel et puis je chercherai pour le timer. Je pense que je mettrai la fonction SetTimer avant une boucle du mm type.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
4 nov. 2006 à 13:54
Salut,
Même dans un timer sans fenêtre, un WM_TIMER est posté dans la pile de message.

La difference c'est juste qu'au lieu d'appeler la wndproc de la fenetre, c'est ta timerproc qui sera appelée.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 nov. 2006 à 13:58
En fait pour WM_TIMER, si on ne spécifie pas de fenêtre, il est envoyé à la fonction DefWindowProc, qui se charge ensuite d'appeler le TimerProc.
Ici je vois pas l'utilité de créer une boucle de messages rien que pour ca.
Pourquoi le Sleep ne te convient-il pas?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
4 nov. 2006 à 14:03
Ben si, il me convient mais j'aurai préfèré un timer mdr . ha ok il faut créer une boucle :s , ok ok on va voir ça.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
Rejoignez-nous