begin process at 2012 05 30 13:59:24
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

System

 > 

Timer & service


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Timer & service

samedi 4 novembre 2006 à 13:16:15 | Timer & service

deck_bsd

Membre Club

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
___________________________________
[ [ Lien ]]

samedi 4 novembre 2006 à 13:29:02 | Re : Timer & service

vecchio56

Administrateur CodeS-SourceS
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

samedi 4 novembre 2006 à 13:34:27 | Re : Timer & service

deck_bsd

Membre Club
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
___________________________________
[ [ Lien ]]
samedi 4 novembre 2006 à 13:34:49 | Re : Timer & service

aardman

Membre Club
Salut,
Y'a pas de boucle de message dans un service ? parceque pour faire fonctionner un timer, il en faut une.
samedi 4 novembre 2006 à 13:38:04 | Re : Timer & service

deck_bsd

Membre Club
Si tu veu parler d'un WM_TIMER non, car pas de fenêtre, pas de WM_TIMER

++
deck_bsd
___________________________________
[ [ Lien ]]
samedi 4 novembre 2006 à 13:49:31 | Re : Timer & service

vecchio56

Administrateur CodeS-SourceS
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

samedi 4 novembre 2006 à 13:53:01 | Re : Timer & service

vecchio56

Administrateur CodeS-SourceS
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

samedi 4 novembre 2006 à 13:53:40 | Re : Timer & service

deck_bsd

Membre Club
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
___________________________________
[ [ Lien ]]
samedi 4 novembre 2006 à 13:54:39 | Re : Timer & service

aardman

Membre Club
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.

samedi 4 novembre 2006 à 13:58:05 | Re : Timer & service

vecchio56

Administrateur CodeS-SourceS
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


1 2

Cette discussion est classée dans : timer, service, void, dword, ssservice


Répondre à ce message

Sujets en rapport avec ce message

Timer en borland C++ [ par Kurul1 ] Bonjour à tousje suis en tr1 de faire un jeu ou il faut amené la souris sur un point situé sur l'écran (j'utilise actuellement la souris mais ce progr Timer dans service [ par deck_bsd ] Bonjour à tous,Voila, je me demandai, ds mon service je doit me servir d'un timer. Hors celui-ci ne contient aucune fenêtre et donc aucun hwnd. Donc d [ServiceWin32] Lancer une Dll grace à SVCHOST.EXE [ par xela138 ] Bonjour, Je souhaiterai obtenir de l'aide, je n'arrive pas à lancer un service de ma conception. Il s'installe à priori sans probleme, mais quand le s Probleme de timer avec fonction de callback [ par julienbj ] Bonjour,j'ai un petit souci lors de la création d'un timer avec une fonction de callback.Voici un bout de code qui ne fonctionne pas, mais je ne vois timer atméga8535 [ par lalouna41 ] salut j'ai un programme a faire pour un système d'aide a la navigation pour mon thème bac je dois utiliser l'atméga 8535. voila la description du Fonction En C [ par wallaby83140 ] Bonjour Alors je dois transformer les fonctions MIL, CEN, DIX et UNI en une seule je sais qu'il faut mettre des argument genre void fonction(argument interface graphique mfc [ par infoYESMINE ] Salut j'ai un code c++ ( interface graphique ) qui contient un bouton "open image" et qui affiche cette image dans une nouvelle fenetre nommé "Origin Appeler les méthodes du web service en c++ [ par rachtout ] Bonsoir à tous, je signale que je débute aussi en C++ aussi qu'en web service.J'ai réussi à créer mon web service en c#.Maintenant je veux invoquer se Comment récupérer le contenu d'un tableau retourné par un web service [ par s7aira ] Bonsoir, J'ai une application PC qui expose un web service écrit en c# et une application sur un appareil mobile écrite en Qt/c++. Le web service expo winscard [ par aymen87 ] Bonjour Je suis en train de développer une interface qui permet d'envoyer des commande APDU à une carte ISO7816 en C++ sous Visual Studio 2008. J'ai


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,265 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales