Exécution parallèle de deux processus

javaction Messages postés 28 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 15 mai 2013 - 15 mai 2013 à 14:44
javaction Messages postés 28 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 15 mai 2013 - 15 mai 2013 à 23:00
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 (tout en l'affichant), j'ai donc crée ce compte à rebours, qui avec
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
fork()
ou encore
select()
! 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
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

6 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 mai 2013 à 15:02
Bonjour.

Si ton but n'est que d'afficher un pseudo compte à rebours, alors il te suffit simplement d'effacer l'écran, puis de réafficher le temps restant.

Voici la méthode la plus simple (pas forcément la meilleur)
int main(void)
{
 int reminaining_time = 60;

 while (reminaining_time > 0)
 {
   --reminaining_time;
   system("clear"); // ou system("cls");
   printf("%i"\n, reminaining_time);
 }

 return 0;
}


Je tiens tout de même à préciser qu'une console n'est pas faite pour cela. Une console est là pour afficher des données qui se suivent. Dès le moment où tu as besoin d'un affichage différent, il faut passer par des bibliothèques graphiques (fenêtrées, comme Qt ou GTK, ou alors console comme ncurses).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
javaction Messages postés 28 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 15 mai 2013
15 mai 2013 à 15:29
Merci pour ta réponse CptPingu,
j'ai déjà une fonction qui permet de faire un compte à rebours, mais ma question ne concerne pas vraiment l'affichage d'un compte à rebours mais plutôt comment le lancer 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
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 mai 2013 à 15:34
Dans ce cas, il faut te pencher sur les pthread :)
La programmation en multithreading est loin d'être simple.

(forker n'est pas ce que tu veux, puisque tu ne veux pas dupliquer le processus, mais bel et bien avoir des routines qui s'exécutent au sein d'un même binaire en parallèle).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
javaction Messages postés 28 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 15 mai 2013
15 mai 2013 à 15:45
Bon c'est ce que je craignais !!!
Sachant en plus que je travaille sur un projet tutoré qu'il faut rendre demain, et n'ayant aucune notion sur les pthread, je pense que je suis bien parti pour une très longue journée là !!!

Je vous remercie beaucoup pour votre aide.
0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 mai 2013 à 16:50
À noter tout de même que si tu veux simplement interrompre une entrée, après un laps de temps donné, et que tu ne cherches pas à faire autre chose que cela en parallèle, alors tu peux faire ceci:
#include <sys/time.h>
#include <sys/types.h>
#include 

#include <stdio.h>

int waitForStdin(int seconds)
{
  fd_set set;
  struct timeval timeout = { seconds, 0 };

  FD_ZERO(&set);
  FD_SET(0, &set);
  return select(1, &set, NULL, NULL, &timeout) == 1;
}

int main(void)
{
  int val = 0;

  printf("Enter a value:\n");
  if(!waitForStdin(3))
    printf("Timeout after 3 seconds!\n");
  else
  {
    scanf("%d", &val);
    printf("Value is: %d\n", val);
  }
  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
javaction Messages postés 28 Date d'inscription mardi 7 juin 2011 Statut Membre Dernière intervention 15 mai 2013
15 mai 2013 à 23:00
Encore merci, mais dans mon programme j'ai un while de "scanf" alors ça ne fonctionne pas ! mais dommage parce que quand il s'agit de saisir juste une valeur ça fonctionne à merveille !
0
Rejoignez-nous