Fonction bloquante et d'attente

Fonction bloquante et d'attente - C - Programmation

Marsh Posté le 08-01-2007 à 22:31:51    

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.
 

Reply

Marsh Posté le 08-01-2007 à 22:31:51   

Reply

Marsh Posté le 08-01-2007 à 22:49:36    

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/
Reply

Marsh Posté le 08-01-2007 à 22:51:09    

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.
Reply

Marsh Posté le 08-01-2007 à 22:56:49    

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/
Reply

Marsh Posté le 08-01-2007 à 23:02:57    

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.
Reply

Marsh Posté le 08-01-2007 à 23:08:33    

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/
Reply

Marsh Posté le 08-01-2007 à 23:28:46    

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 ).
 

Reply

Marsh Posté le 08-01-2007 à 23:44:52    

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/
Reply

Marsh Posté le 09-01-2007 à 10:50:32    

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

Reply

Marsh Posté le 09-01-2007 à 12:26:45    

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/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed