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 :

Timer


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Points : 100
    Points
    100
    Par défaut Timer
    dans le cadre de mon projet , je dois realiser un timer , qui va comparer la date et l heure inscrit dans un fichier xml avec la date et l heure du systeme et qui va realiser un action si la condition est realisee

    je vous mets ici l enonce exact du projet
    - Lancer un timer qui lance un test toutes les 5 minutes :
    ([heure_système]>[heure_job]) && ([date_système]<=[date_job])
    - Quand le service trouve un job vérifiant la condition, il change la valeur date :
    [date_job]=[date_système]+[1jour]
    je vous mets ensuite mes fonction qui me permettent de parser le fichier xml , et de lire donc uniquement le contenu entre balises

    j ai plusieurs problemes qui se presentent :
    - je ne sais pas comment recuperer separement l heure et la date systeme , car j ai trouve des fonctions qui recuperent tout en meme temps
    -je ne sais pas comment faire pour comparer les 2 heures/dates car je vois pas comment recuperer le contenu entre les balises heure et dates

    aidez moi svp , je vous en prie car je dois rendre ca bientot


    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    void recupXML()
    {
      register short int i=-1;
      register unsigned int j=0;
      char * tab = NULL;
     
    	FILE * fp = NULL;
     
     
    	char * chaine = (char *)malloc(256*sizeof(char));
    	if(chaine == NULL)
        {
          printf("Memoire insuffisante, arret du programme.");
          exit(1);    
        }
     
      if((fp = fopen("data.xml","r+"))==NULL)
      {
        printf("ERREUR LORS DE L'OUVERTURE DU FICHIER\n");
        exit(1);
      }
     
      while(fgets(chaine, 255, fp))
      {
        if(!strcmp(chaine, "</automatisation>"))
          break;
     
        chaine = formatAff(chaine, i, j);
     
        if(i==6)
        {
          i=1;
          j++;
        }
        else 
          i++;
      }
      fclose(fp);
     
    }
     
     
     
     
     
    char * formatAff(char * chaine, int i, int j)
    {
        char * tampon = (char *)malloc(256*sizeof(char));
        if(tampon == NULL)
        {
            printf("Memoire insuffisante, arret du programme.");
            exit(1);
        }
     
      switch(i)
      { 
        case 2:
        tampon = couperDebut(chaine,13);
        tampon = couperFin(tampon, 11); 
        break;
     
        case 3:
        tampon = couperDebut(chaine, 21);
        tampon = couperFin(tampon, 19);
        break;
     
     
        case 4:
        tampon = couperDebut(chaine,11);
        tampon = couperFin(tampon, 9);
        break;
     
        case 5:
        tampon = couperDebut(chaine,10);
        tampon = couperFin(tampon, 8);
      }
      return tampon;
    }
     
     
    char * couperDebut(char * chaine, int n)
    {
      register int i=0;
      char * tampon = (char *)malloc(256*sizeof(char));
        if(tampon == NULL)
        {
            printf("Memoire insuffisante, arret du programme.");
            exit(1);
        }
     
      for(i=0;i<256;i++)
      {
        if(chaine[i]=='\0')
          break;
     
        tampon[i] = chaine[i+n];
      }
      tampon[i] = '\0';
     
     return(tampon);
    }     
     
    char * couperFin(char * chaine, int n)
    {
      register int i;
      char * tampon = (char *)malloc(256*sizeof(char));
        if(tampon == NULL)
        {
            printf("Memoire insuffisante, arret du programme.");
            exit(1);
        }
     
      for(i=0;i<256;i++)
      {
        if(chaine[i+n]=='\0')
          break;
     
        tampon[i] = chaine[i];
      }
      tampon[i]='\0';
     return(tampon);     
    }

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ca c'est du C et c'est le forum à coté.
    Donc message à déplacer et mon post est à supprimer.

    Sinon: pour l'heure regarde du coté de <time.h> (man time.h sur google)
    Pour la comparaison, aucune idée, jamais fait mais regarde si tu peux pas convertir ton heure en Timestamp, dans ce cas, la comparaison est facile.

    Merci.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Points : 100
    Points
    100
    Par défaut
    ok merci de m avoir repondu , mais je ne vois aucune fonction qui separe la date de l heure
    ca reunit tout a la fois

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    voir les fonctions time et gmtime

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Points : 100
    Points
    100
    Par défaut
    ok
    merci beaucoup a vous
    j ai reussi , mais maintenant j ai un probleme quant a son insertion , en effet , je voudrais faire une sorte de timer du genre

    - Lancer un timer qui lance un test toutes les 5 minutes :
    ([heure_système]>[heure_job]) && ([date_système]<=[date_job])
    - Quand le service trouve un job vérifiant la condition, il change la valeur date :
    [date_job]=[date_système]+[1jour]
    sachant que le job se trouve dans un fichier xml , j ai fait plusieurs fonctions qui me permettent de lire, parser(recuperer le contenu entre balises xml),recuperer separement l heure et la date systeme

    ces fonctions marchent toutes sans problemes, mais je suis bloque pour realiser le test plus haut
    j ai fait une fonction timer pour comparer les 2 dates/heures , mais je suis sur qu elle est fausse
    si vous pouvez m aiguiller svp , ca serait sympa


    mes fonctions qui marchent

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    void recupXML()// permet de lire le fichier xml
    {
      register short int i=-1;
      register unsigned int j=0;
     
     
    	FILE * fp = NULL;
     
     
    	char * chaine = (char *)malloc(256*sizeof(char));
    	if(chaine == NULL)
        {
          printf("Memoire insuffisante, arret du programme.");
          exit(1);    
        }
     
      if((fp = fopen("data.xml","r+"))==NULL)
      {
        printf("ERREUR LORS DE L'OUVERTURE DU FICHIER\n");
        exit(1);
      }
     
      while(fgets(chaine, 255, fp))
      {
        if(!strcmp(chaine, "</automatisation>"))
          break;
     
        chaine = formatAff(chaine, i, j);
     
        if(i==6)
        {
          i=1;
          j++;
        }
        else 
          i++;
      }
      fclose(fp);
     
    }
     
     
     
     
     
    char * formatAff(char * chaine, int i, int j)// permet de parser le xml( recuperer le contenu entre balises)
    {
        char * tampon = (char *)malloc(256*sizeof(char));
        if(tampon == NULL)
        {
            printf("Memoire insuffisante, arret du programme.");
            exit(1);
        }
     
      switch(i)
      { 
        case 2:// balise nom
        tampon = couperDebut(chaine,13);
        tampon = couperFin(tampon, 11); 
        break;
     
        case 3://balise adresse
        tampon = couperDebut(chaine, 21);
        tampon = couperFin(tampon, 19);
        break;
     
     
        case 4:// balise heure
        tampon = couperDebut(chaine,11);
        tampon = couperFin(tampon, 9);
        break;
     
        case 5://balise date
        tampon = couperDebut(chaine,10);
        tampon = couperFin(tampon, 8);
      }
      return tampon;
    }
     
     
    char * couperDebut(char * chaine, int n)// coupe les premieres balises"<>"
    {
      register int i=0;
      char * tampon = (char *)malloc(256*sizeof(char));
        if(tampon == NULL)
        {
            printf("Memoire insuffisante, arret du programme.");
            exit(1);
        }
     
      for(i=0;i<256;i++)
      {
        if(chaine[i]=='\0')
          break;
     
        tampon[i] = chaine[i+n];
      }
      tampon[i] = '\0';
     
     return(tampon);
    }     
     
    char * couperFin(char * chaine, int n)// couper les derniere balises "</>"
    {
      register int i;
      char * tampon = (char *)malloc(256*sizeof(char));
        if(tampon == NULL)
        {
            printf("Memoire insuffisante, arret du programme.");
            exit(1);
        }
     
      for(i=0;i<256;i++)
      {
        if(chaine[i+n]=='\0')
          break;
     
        tampon[i] = chaine[i];
      }
      tampon[i]='\0';
     return(tampon);     
    }
     
     
     
     
     
     
     
     
    void recupheuredate(){// recupere separement la date et l heure systeme
    /* Lecture de la date et de l'heure */
    time_t timestamp=time (NULL);
    struct tm t = *localtime(&timestamp);
     
    char sheure[128];
    char sdate[128];
    /* Affiche la date et l'heure courante (format français) */
     
    setlocale(LC_ALL, "");
     
      strftime(sdate,sizeof sdate,"%A %d %B %Y ", &t);
      strftime(sheure,sizeof sheure, "%Hh %Mmin %Ssec",&t);
     
      printf ("%s\n",sdate);
       printf ("%s\n",sheure);
     
    }

    ma fonction timer qui bloque

    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
    20
    21
    22
    23
    24
    char * timer( char * tampon,int i,int j,char sheure,char sdate,char * chaine )
    {// compariasion entre la date/heure systeme et la date/heure du fichier xml
    	char heurexml[128];
    	char datexml[128];
    	recupXML();
    	formatAff(chaine,i,j);
     
     
    	   if (i=4 )
    	   {
    		   heurexml==formatAff(chaine,4,j);
    	   }
    	   else if(i=5)
    	   {
    		   datexml==formatAff(chaine,5,j);
    	   }        
     
    	   recupheuredate();
    	   if(difftime(sdate,datexml) && difftime(sheure,heurexml) >=0)
    			   {
    				   datexml==sdate;
    			   }
    	   return 0;
    }

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            char heurexml[128];
    	char datexml[128];
    ...
    	   if (i=4 ) 
    	   {
    		   heurexml==formatAff(chaine,4,j); 
    	   }
    	   else if(i=5)
    	   {
    		   datexml==formatAff(chaine,5,j);
    	   }
    La comparaison se fait avec ==, pas =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	   if (i==4 ) 
    ...
    	   else if(i==5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    heurexml==formatAff(chaine,4,j);
    compare heurexml et le retour de la fonction et ne fait rien du résultat de la comparaison. Ceci ne fait rien de plus que Probablement l'intention était une affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    heurexml=formatAff(chaine,4,j);
    Mais ceci conduira à une erreur, puisque heurexml est un tableau et qu'il est impossible d'écrire tableau = ....
    Si il s'agit de copier un tableau dans un autre, il faut le faire élément par élément ou utiliser une fonction de la bibliothèque qui le fera pour nous.

    Idem pour datexml
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Points : 100
    Points
    100
    Par défaut
    merci beaucoup de m avoir repondu
    c est super sympa

    en effet , quant je fais = ca me met une erreur de l-value

    Si il s'agit de copier un tableau dans un autre, il faut le faire élément par élément ou utiliser une fonction de la bibliothèque qui le fera pour nous.

    Idem pour datexml
    ca ve dire que je dois utiliser une boucle for et parcourir les cases avec un i pour ensuite les affecter ? c ca ou j ai pas compris stp

    tu pourrais me donner un exemple quelconque
    je te remercie beaucoup pour ton aide car c est fait 3 jour que je suis bloque a mon projet en cause de cette fonction

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    ca ve dire que je dois utiliser une boucle for et parcourir les cases avec un i pour ensuite les affecter ?
    Oui ou d'utiliser une fonction de la bibliothèque adaptée à ton cas (strcpy, memcpy, memmove,...)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Points : 100
    Points
    100
    Par défaut
    ok
    merci beaucoup
    je vais tester ca dessuite
    merci pour tout

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Points : 100
    Points
    100
    Par défaut
    ok , c est bon j ai reussi
    mais maintenant je dois faire le timer en question qui doit s executer toutes les 5 minutes


    je sais que ca un rapport avec sleep et repeat, mais je ne vois pas comment l utiliser

    t aurai aps un squelette de code pour que je voie comment l utiliser
    merci beaucoup

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ulquiorra Voir le message
    je dois faire le timer en question qui doit s executer toutes les 5 minutes

    je sais que ca un rapport avec sleep et repeat, mais je ne vois pas comment l utiliser
    C'est un peu élémentaire, non ?

    Pseudo code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DO
     sleep(5)
     action()
    FOREVER
    La programmation demande de la réflexion et non la recopie de code déjà fait...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Points : 100
    Points
    100
    Par défaut
    ok merci beaucoup

    c est vrai qu il faut reflechir , mais je ne peut rien faire si je ne connais pas la structure meme de la fonction

    c est pour ca que je demande toujours un exemple de fonction pour m aiguillier sur la voie

    merci beaucoup pour ta reponse
    je vais tester de ce pas

  13. #13
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pseudo code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DO
     sleep(5)
     action()
    FOREVER
    La programmation demande de la réflexion et non la recopie de code déjà fait...
    Ou alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DO
     sleep(5 * 60)
     action()
    FOREVER
    Mais je ne m'y connais pas trop en pseudo code...

    A+

    Pfeuh

Discussions similaires

  1. Comment faire un Timer de fonction PORTABLE ?
    Par dieuP1guin dans le forum C
    Réponses: 3
    Dernier message: 04/07/2003, 10h44
  2. [horloge] conflit caractère / timer
    Par JeanJean dans le forum C
    Réponses: 10
    Dernier message: 09/05/2003, 23h47
  3. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  4. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  5. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59

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