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 :

exécution parallèle de deux processus


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut exécution parallèle de deux processus
    Bonjour tout le monde,
    je tiens d'abord à vous remercier pour l'éventuelle aide que vous pourriez m'apporter, ensuite voilà ma question :

    je suis entrain d'implémenter un jeu, et dans ce jeu j'ai besoin d'un compte à rebours qui, au bout de 3 min arrête le jeu.

    Cependant, j'ai aussi besoin de faire en sorte que l'utilisateur puisse continuer à saisir des informations au clavier pendant que le compte à rebours continue à se décrémenter, j'ai donc crée ce compte à rebours, qui avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\033[A\033[K");
    met à jours le décompteur en effaçant la ligne puis reaffiche la nouvelle valeur du compteur !
    exemple : 03:00, il efface cette valeur puis affiche à sa place 02:59 et on a l'impression d'avoir un compte à rebours "dynamique".

    Pour pouvoir executer les 2 tâches ( saisie et compte à rebours) en parallèle, je pense qu'il faut créer deux processus avec ! mais lorsque je donne la tâche du compte à rebours au père et la saisie au fils, le compte à rebours s'affiche bien mais le curseur de la saisie revient au début de la ligne du compte à rebours (à cause de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\033[A\033[K");
    qui est dans le compte à rebours probablement) ! donc je ne peux pas bien saisir des informations !
    comment puis je faire tourner bien séparément ces deux tâches sans erreurs !?

    Merci

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Le mieux dans ce cas la serait plutot d'utiliser un thread ou de tout faire dans le meme processus. Je m'explique :

    - avec le thread, tu te debrouilles pour utiliser une variable statique stockee dans une fonction getVar (ou un truc dans le genre) qui te renverra la valeur de cette variable. Un truc comme ca :

    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
    int get_var(int v)
    {
       static int var;
       static pthread_t mutex  = MUTEX_INIT;
     
       if (v)
      {
         pthread_mutex_lock(&mutex);
         var = v;
         pthread_mutex_unlock(&mutex);
         return v;
       }
       pthread_mutex_lock(&mutex);
       v = var;
       pthread_mutex_unlock(&mutex);
       return v;
    }
     
    void  *thread_func(void *l)
    {
      int  timer = *l;
     
      get_var(timer);
      while ((timer = get_var(0)) > 0)
      {
         get_var(timer - 1); // on decremente de 1
      }
    }
     
    void   main_func()
    {
      // on lance le thread
      //on lit les donnees
    }
    - deuxieme solution (un seul processus et pas de thread) :

    Pour cette solution je vois 2 possibilites, l'utilisation de la fonction select (seulement si t'es sous linux par contre) ou alors rendre ton read non bloquant.

    Bonne chance.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 669
    Points
    23 669
    Par défaut
    Hello,

    Il faut se souvenir qu'il n'y a pas si longtemps, les systèmes d'exploitation n'offraient même pas la possibilité de créer un thread ou un processus fils. Créer un processus distinct uniquement pour gérer le compteur avec toutes les contraintes techniques que cela implique (race conditions, communication entre les deux, demande explicite de terminaison du fils, possibilité qu'il se fasse tuer par l'admin alors que l'autre tourne encore…), c'est un peu excessif.

    Le mieux, sur systèmes Posix, consiste effectivement à utiliser select() en spécifiant une valeur de timeout au dernier paramètre. Cet appel se débloquera soit s'il y a quelque chose à lire, soit si le délai de grâce est échu.

    Donc, juste après cet appel, tu vérifies si ton descripteur en lecture est marqué et dans le cas contraire, tu décrémentes ton compteur et tu refais un tour de boucle.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    merci pour vos reponses, mais je comme je vous l'ai dit, je suis encore débutant en c ! donc pour la solution de imperio, j'ai fait comme il est indiqué en incluant <pthread.h> et en ajoutant -lpthread à la fin de ma ligne de commande mais il m'indique encore des erreurs bizarres de type "passing argument 1 of ‘pthread_mutex_lock’ from incompatible pointer type" ! je ne sais pas d'où ça vient l'erreur !
    Si non pour ta proposition Obsidian, je n'ai pas bien compris, si tu peux me proposer un exemple !

    Merci encore à vous.

  5. #5
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Citation Envoyé par koko31 Voir le message
    merci pour vos reponses, mais je comme je vous l'ai dit, je suis encore débutant en c ! donc pour la solution de imperio, j'ai fait comme il est indiqué en incluant <pthread.h> et en ajoutant -lpthread à la fin de ma ligne de commande mais il m'indique encore des erreurs bizarres de type "passing argument 1 of ‘pthread_mutex_lock’ from incompatible pointer type" ! je ne sais pas d'où ça vient l'erreur !
    L'erreur est indiquee dans le message...

    Citation Envoyé par koko31 Voir le message
    Si non pour ta proposition Obsidian, je n'ai pas bien compris, si tu peux me proposer un exemple !

    Merci encore à vous.
    Dans le man de select (dont j'ai donne le lien) il y a un exemple.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je suis désolé mais l'exemple qui m'a été donné ne m'a pas aidé à avancer !
    En résumé ma question est comment lancer un compte à rebours en arrière plan (sans forcement qu'il soit affiché) tout en continuant une série de saisie et de traitement et qu'à la fin du compte à rebours, tout s'arrête !

    Merci

  7. #7
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Autre solution (c'est un remix des précédentes) :

    - tu crées un thread qui exécutera en parallèles les opérations que tu veux.
    - tu utilises la fonction Sleep (windows) / usleep(unix) pour stopper ton thread principal le temps que tu veux
    - tu tues les threads

Discussions similaires

  1. Communication par pipe entre deux processus
    Par mohamedz dans le forum POSIX
    Réponses: 9
    Dernier message: 02/03/2010, 17h50
  2. lancer et arreter deux processus identique
    Par mandagor dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 31/10/2007, 15h27
  3. Redirection entrée standard entre deux processus
    Par mverhaeghe dans le forum POSIX
    Réponses: 5
    Dernier message: 08/04/2007, 16h55
  4. deux processus utilisant une meme memoire
    Par scorpion06 dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 06/03/2007, 18h27
  5. [DEBUTANT] Deux processus en parallèle ?
    Par alex6891 dans le forum Threads & Processus
    Réponses: 11
    Dernier message: 22/11/2005, 07h51

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