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 :

Changement d'état d'une variable au bout de x secondes


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Points : 24
    Points
    24
    Par défaut Changement d'état d'une variable au bout de x secondes
    Salut à tous. Voila j'ai fais un seveur unix, avec des structures "Objet" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct
    {
    	int num; 
          	char categorie [MAXT];
          	char titre [MAXT]; 
          	char description [MAXT];   
          	int duree;
          	int prix_depart;
          	int termine;   
    } objet;
    Je voudrais que la variable termine passe à 1 au bout de duree secondes.
    J'ai regardé du coté des timers, mais je ne vois pas comment et ou le lancer pour chaque nouvel objet créé.

    En vous remerciant dans l'espoir d'un éclaircissement !

  2. #2
    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 sqwam71
    Salut à tous. Voila j'ai fais un seveur unix, avec des structures "Objet" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct
    {
    	int num; 
          	char categorie [MAXT];
          	char titre [MAXT]; 
          	char description [MAXT];   
          	int duree;
          	int prix_depart;
          	int termine;   
    } objet;
    Je voudrais que la variable termine passe à 1 au bout de duree secondes.
    J'ai regardé du coté des timers, mais je ne vois pas comment et ou le lancer pour chaque nouvel objet créé.

    En vous remerciant dans l'espoir d'un éclaircissement !
    Tu peux demander à un thread de changer la valeur au bout de tant de secondes. Il suffit de lui demander gentiment.

    Déjà une version sans thread pour bien voir que pendant 10 secondes (àprès un start), on pas pas la main, et qu'on ne peut pas passer de commande (mais elles ne sont pas perdues pour autant, et au bout des 10 secondes, elles se déclenchent toutes seules)
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define MAXT 16
     
    #ifdef WIN32
    #include <windows.h>
    #define msleep(ms) Sleep(ms)
    #endif
     
    typedef struct
    {
       int num;
       char categorie[MAXT];
       char titre[MAXT];
       char description[MAXT];
       int duree;
       int prix_depart;
       int termine;
    }
    objet;
     
    static void clean (char *s)
    {
       /* search */
       char *p = strchr (s, '\n');
       if (p != NULL)
       {
          /* kill */
          *p = 0;
       }
       else
       {
          /* purge */
          int c;
          while ((c = getchar ()) != '\n' && c != EOF)
          {
          }
       }
    }
     
    static void prompt (char const *s)
    {
       printf ("%s > ", s);
       fflush (stdout);
    }
     
    void *task (void *p_user)
    {
       if (p_user != NULL)
       {
          objet *p_data = p_user;
     
          printf("\n");
          prompt ("task");
          printf ("start %d sec\n", p_data->duree);
          prompt ("main");
     
          msleep (p_data->duree * 1000);
     
          p_data->termine = 1;
     
          printf("\n");
          prompt ("task");
          printf ("end\n");
          prompt ("main");
     
       }
       return NULL;
    }
     
    int main (void)
    {
     
    /* mini shell */
     
       int end = 0;
       objet data = {0};
     
       while (!end)
       {
          char command[32];
     
          prompt ("main");
          fgets (command, sizeof command, stdin);
          clean (command);
     
          if (*command != 0)
          {
             if (strcmp (command, "help") == 0)
             {
                puts ("commands : help start quit");
             }
             else if (strcmp (command, "start") == 0)
             {
                data.termine = 0;
                data.duree = 10;
                task (&data);
             }
             else if (strcmp (command, "status") == 0)
             {
                printf ("termine = %d\n", data.termine);
             }
             else if (strcmp (command, "quit") == 0)
             {
                end = 1;
             }
             else
             {
                puts ("unknown command");
             }
          }
       }
     
       return 0;
    }
    Et maintenant, la version avec thread qui rend la main immédiatement et qui permet donc de faire ce qu'on veut en même temps (passer des commandes etc.)

    Par contre j'ai mis une synchronisation (join) qui permet de n'arrêter le programme que si la tâche est effectivement terminée :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #include <pthread.h>
     
    #define MAXT 16
     
    #ifdef WIN32
    #include <windows.h>
    #define msleep(ms) Sleep(ms)
    #else
    /* ajouter l'include qui va bien pour usleep */
    #define msleep(ms) usleep((ms) * 1000)
    #endif
     
    typedef struct
    {
       int num;
       char categorie[MAXT];
       char titre[MAXT];
       char description[MAXT];
       int duree;
       int prix_depart;
       int termine;
    }
    objet;
     
    static void clean (char *s)
    {
       /* search */
       char *p = strchr (s, '\n');
       if (p != NULL)
       {
          /* kill */
          *p = 0;
       }
       else
       {
          /* purge */
          int c;
          while ((c = getchar ()) != '\n' && c != EOF)
          {
          }
       }
    }
     
    static void prompt (char const *s)
    {
       printf ("%s > ", s);
       fflush (stdout);
    }
     
    void *task (void *p_user)
    {
       if (p_user != NULL)
       {
          objet *p_data = p_user;
     
          printf("\n");
          prompt ("task");
          printf ("start %d sec\n", p_data->duree);
          prompt ("main");
     
          msleep (p_data->duree * 1000);
     
          p_data->termine = 1;
     
          printf("\n");
          prompt ("task");
          printf ("end\n");
          prompt ("main");
     
       }
       return NULL;
    }
     
    int main (void)
    {
     
    /* mini shell */
     
       int end = 0;
       objet data = {0};
     
       pthread_t pt;
     
       while (!end)
       {
          char command[32];
     
          prompt ("main");
          fgets (command, sizeof command, stdin);
          clean (command);
     
          if (*command != 0)
          {
             if (strcmp (command, "help") == 0)
             {
                puts ("commands : help start status quit");
             }
             else if (strcmp (command, "start") == 0)
             {
                data.termine = 0;
                data.duree = 10;
                pthread_create (&pt, NULL, task, &data);
             }
             else if (strcmp (command, "status") == 0)
             {
                printf ("termine = %d\n", data.termine);
             }
             else if (strcmp (command, "quit") == 0)
             {
                end = 1;
             }
             else
             {
                puts ("unknown command");
             }
          }
       }
     
       pthread_join (pt, NULL);
     
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    ça m'a l'air pas mal du tout ... je n'avais même pas pensé au thread (boulet).

    Merci, je matte ça et je donne des nouvelles ! Merki bcp

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Alors gros problème, le thread ne rend pas la main.

    Cela met en pose le programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    objet obj;
    obj.termine = 0;
    pthread_t pt;  
    if (pthread_create (&pt, NULL, task, &obj) < 0) {       // permet de créer le thread et de l'associer à la fonction task
        fprintf (stderr, "pthread_create erreur ! \n");
        exit (1);
      }
    pthread_join (pt, NULL);  // attend la fin des threads 
     
    	menu(f);
    Par exemple, ici le menu ne se lance que après le sleep.

    Comment faire pour lancer le thread et pouvoir lancer une autre méthode immédiatement, sans attendre la fin du sleep ?? Svp j'ai tout essayer mais rien, je galère

  5. #5
    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 sqwam71
    Alors gros problème, le thread ne rend pas la main.

    Cela met en pose le programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    objet obj;
    obj.termine = 0;
    pthread_t pt;  
    if (pthread_create (&pt, NULL, task, &obj) < 0) {       // permet de créer le thread et de l'associer à la fonction task
        fprintf (stderr, "pthread_create erreur ! \n");
        exit (1);
      }
    pthread_join (pt, NULL);  // attend la fin des threads 
     
    	menu(f);
    Par exemple, ici le menu ne se lance que après le sleep.

    Comment faire pour lancer le thread et pouvoir lancer une autre méthode immédiatement, sans attendre la fin du sleep ?? Svp j'ai tout essayer mais rien, je galère
    Ben il ne fait certainement pas mettre join() ici, mais à la fin du main()...

    join() est bloquant. Il attend la fin du thread...
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. [SQL] Détection du changement de valeur d'une variable
    Par micatmidog dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/06/2007, 20h22
  2. Changement de classe d'une variable
    Par lebigboss dans le forum Langage
    Réponses: 1
    Dernier message: 15/05/2007, 16h51
  3. Réponses: 8
    Dernier message: 29/03/2007, 14h48
  4. [VB.NET]Test sur changement de valeur d'une variable
    Par shinji_rem dans le forum Windows Forms
    Réponses: 9
    Dernier message: 29/11/2006, 15h53
  5. Intercepter le changement de valeur d'une variable
    Par Captain_JS dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/01/2005, 08h04

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