Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1482 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Fonction bloquante et d'attente

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction bloquante et d'attente

n°1500564
galaxed
Posté le 08-01-2007 à 22:31:51  profilanswer
 

Bonjour bonjour,
 
Voila j'aurai besoin d'aide car je trouve pas le nom des fonctions qui m'interessent.
Pour commencer je cherche une fonction bloquante en gros je veux pouvoir faire :
 Faire
{  
 ..
}
tant que pas d'appuie sur une touche
 
Ensuite je cherche une fonction qui me permettent de déterminer combien de temps je veux attendre avant que mon programme continue.
 
En vous remerciant d'avance.
 

mood
Publicité
Posté le 08-01-2007 à 22:31:51  profilanswer
 

n°1500570
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-01-2007 à 22:49:36  profilanswer
 

galaxed a écrit :

Voila j'aurai besoin d'aide car je trouve pas le nom des fonctions qui m'interessent.
Pour commencer je cherche une fonction bloquante en gros je veux pouvoir faire :
 Faire
{
 ..
}
tant que pas d'appuie sur une touche

 

Ensuite je cherche une fonction qui me permettent de déterminer combien de temps je veux attendre avant que mon programme continue.

 

En vous remerciant d'avance.


En gros, tu veux lancer une tache de saisie, mais pendant un temps limité, c'est ça  ? Quelques threads avec une suspension devraient faire l'affaire

 
Code :
  1. THREAD saisie (data)
  2. BEGIN
  3.    OUTPUT "Entrer une donnee" EOL
  4.    data.data := INPUT ; saisie : en C n'ilporte quelle fonction standard de lecture sur stdin est blocante.
  5.    data.created := 0
  6. END
  7. PROCEDURE main
  8. BEGIN
  9.    saisie_data.created := 1
  10.    thread_create(saisie, saisie_data)
  11.    sleep (T)
  12.    IF data.created
  13.       thread_kill (saisie)
  14.       saisie_data.created := 0
  15.    END
  16. END

Message cité 1 fois
Message édité par Emmanuel Delahaye le 08-01-2007 à 22:56:00

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1500571
0x90
Posté le 08-01-2007 à 22:51:09  profilanswer
 

Emmanuel Delahaye a écrit :

En gros, tu veux lancer une tache de saisie, mais pendant un temps limité, c'est ça  ? Quelques threads avec une suspension devraient faire l'affaire
 

Code :
  1. THREAD saisie (data)
  2. BEGIN
  3.    OUTPUT "Entrer une donnee" EOL
  4.    data.data := INPUT ; saisie
  5.    data.created := 0
  6. END
  7. PROCEDURE main
  8. BEGIN
  9.    saisie_data.created := 1
  10.    thread_create(saisie, saisie_data)
  11.    sleep (T)
  12.    IF data.created
  13.       thread_kill (saisie)
  14.       saisie_data.created := 0
  15.    END
  16. END



 
Je dis ça sans réflechir, mais un select avec timeout ça peut pas faire l'affaire ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1500575
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-01-2007 à 22:56:49  profilanswer
 

0x90 a écrit :

Je dis ça sans réflechir, mais un select avec timeout ça peut pas faire l'affaire ?


Sous Linux, oui. Sous Windows, non.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1500580
0x90
Posté le 08-01-2007 à 23:02:57  profilanswer
 

Emmanuel Delahaye a écrit :

Sous Linux, oui. Sous Windows, non.


 
pas d'équivalent à poll/select sous win ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1500581
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-01-2007 à 23:08:33  profilanswer
 

0x90 a écrit :

pas d'équivalent à poll/select sous win ?


select() existe, mais ne traite pas les I/O, uniquement les flux sockets. Sinon, il y a WaitForMultipleObjetct() ou un truc comme ça, mais c'est tordu à souhait. Du Microsoft pur et dur...

 


Message édité par Emmanuel Delahaye le 08-01-2007 à 23:08:44

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1500584
galaxed
Posté le 08-01-2007 à 23:28:46  profilanswer
 

Oula vous me parlez chinois la ^^. Je vous explique concretement ce que je veux faire :
J'ai un déplacement d'une croix sur une matrice par exemple ( a la pacman ) et je veux que la croix avance dans une direction ( par exemple de gauche a droite tant que j'ai pas appuyez sur une touche ( disons q ). Quand j'appuie sur q je veut que la croix ait dorénavant un déplacement du haut vers le bas. Je peux pas utiliser getch ou scanf car sinon ca me bloque le programme tant que j'ai pas rentré de touches...
 
Donc je veux que mon programme tourne et que lorsque j'appuie sur une touche, le programme le détecte ( et comme ca je fous un getch apres pour récuperer la touche taper ).
 

n°1500590
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-01-2007 à 23:44:52  profilanswer
 

galaxed a écrit :

J'ai un déplacement d'une croix sur une matrice par exemple ( a la pacman ) et je veux que la croix avance dans une direction ( par exemple de gauche a droite tant que j'ai pas appuyez sur une touche ( disons q ). Quand j'appuie sur q je veut que la croix ait dorénavant un déplacement du haut vers le bas. Je peux pas utiliser getch ou scanf car sinon ca me bloque le programme tant que j'ai pas rentré de touches...
 
Donc je veux que mon programme tourne et que lorsque j'appuie sur une touche, le programme le détecte ( et comme ca je fous un getch apres pour récuperer la touche taper ).


 
DOS/Windows :
 
Tu peux protéger getch() par kbhit() :  

Code :
  1. for (;;)
  2.    {
  3.       if kbhit()
  4.       {
  5.          int c = getch(); 
  6.          /* determiner la direction selon c *(on sait aussi saisir les fleches si necessaire...) /
  7.       }
  8.       /* deplacer la croix dans la direction indiquée. */
  9.       Sleep(1); /* a regler selon l'effet voulu */
  10.    }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1500687
rufo
Pas me confondre avec Lycos!
Posté le 09-01-2007 à 10:50:32  profilanswer
 

je pensais aussi à kbhit() mais c'est pas portable :/ S'il est sous Linux, c'est mort...

n°1500716
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-01-2007 à 12:26:45  profilanswer
 

rufo a écrit :

je pensais aussi à kbhit() mais c'est pas portable :/ S'il est sous Linux, c'est mort...


J'ai bien précisé "DOS/Windows"

 

Mais on sait simuler kbhit() et getch() sous Linux...

 

KBHIT.H

Code :
  1. #ifndef H_KBHIT
  2. #define H_KBHIT
  3. void   init_keyboard(void);
  4. void   close_keyboard(void);
  5. int      kbhit(void);
  6. int     readch(void);
  7. #endif
 

KBHIT.C

 
Code :
  1. #include "kbhit.h"
  2. #include <termios.h>
  3. #include <unistd.h>   // for read()
  4. static struct termios initial_settings, new_settings;
  5. static int peek_character = -1;
  6. void init_keyboard()
  7. {
  8.     tcgetattr(0,&initial_settings);
  9.     new_settings = initial_settings;
  10.     new_settings.c_lflag &= ~ICANON;
  11.     new_settings.c_lflag &= ~ECHO;
  12.     new_settings.c_lflag &= ~ISIG;
  13.     new_settings.c_cc[VMIN] = 1;
  14.     new_settings.c_cc[VTIME] = 0;
  15.     tcsetattr(0, TCSANOW, &new_settings);
  16. }
  17. void close_keyboard()
  18. {
  19.     tcsetattr(0, TCSANOW, &initial_settings);
  20. }
  21. int kbhit()
  22. {
  23. unsigned char ch;
  24. int nread;
  25.     if (peek_character != -1) return 1;
  26.     new_settings.c_cc[VMIN]=0;
  27.     tcsetattr(0, TCSANOW, &new_settings);
  28.     nread = read(0,&ch,1);
  29.     new_settings.c_cc[VMIN]=1;
  30.     tcsetattr(0, TCSANOW, &new_settings);
  31.     if(nread == 1)
  32.     {
  33.         peek_character = ch;
  34.         return 1;
  35.     }
  36.     return 0;
  37. }
  38. int readch()
  39. {
  40. char ch;
  41.     if(peek_character != -1)
  42.     {
  43.         ch = peek_character;
  44.         peek_character = -1;
  45.         return ch;
  46.     }
  47.     read(0,&ch,1);
  48.     return ch;
  49. }



Message édité par Emmanuel Delahaye le 09-01-2007 à 12:37:01

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Fonction bloquante et d'attente

 

Sujets relatifs
Fonction FILE, file_get_contents qui marche pas toujours. Help!Fonction gérant les prédicats
extraire des mots en fonction de leur mise en forme[javascript]Bouton en fonction de la page
[Résolu] Exécuter une action en fonction du choix dans un menuLibérer la mémoire et fonction recvfrom
Adapter la taille d'un <div> en fonction d'un autre???Paramètres pour un fonction javascript
[RegEx] Motif incorrecte ou mauvaise fonction..Fonction ALEA() et fonction de répartition sous Excel
Plus de sujets relatifs à : Fonction bloquante et d'attente


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR