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 :

Sortir d'un progamme qui boucle ou qui refresh


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut Sortir d'un progamme qui boucle ou qui refresh
    Voilà , j'aimerai par exemple un programme qui affiche l'heure en mode console sous linux.(GCC)
    Je fait un boucle avec un sleep de 1 seconde, donc toutes les secondes g l'heure qui est rafraichie.

    Mais j'aimerai pouvoir sortir de ce programme ou bien geler l'heure ou bien la faire reprendre...
    Ex: Appuiyer sur Q pour sortir du porgramme, Sur P pour faire pause, sur R pour reprendre.

    J'imagine qu'il faut un systeme de type thread...

    Voici le programme en language humain:

    Debut:

    Procédure heure:
    efface écran;
    Affiche l'heure ;
    appel sleep (1seconde);
    retourne procedure heure

    // En parrallèle avec cela je voudrais qu'il check si une touche a pa été appyuer contenant Q,R //ou P et que si une de ses touches a été pressé soit il quitte soit il pause soit il reprend.
    // Si je place la fonctin Cin dans la boucle il va attendre a chaque fois que l'on presse une //touche donc ne refresh plus toute les seconde mais dépend de ma touche.

    Procédure Partie parralèle:

    Boucle
    Si touche R enfoncé va a heure
    Si touche P enfoncé affiche touche P enfoncé et attend que R soi enfoncé.
    Si R enfoncé retourne a heure
    Si Q enfoncé quitte le porgramme.

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    fonction traiter keypressed
    {}
    main{
    répéter
      appeler fonction traiter keypressed
      afficher l'heure  
      sleep
      matouche=keypressed (getchar,getche,...)
    tant que matouche!='Q'
    }
    par exemple, mais il faut l'élaborer...

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Je pense que ce n'est pas ce qu'il me faut

    Voila si je comprend bien le programme va appeler la fonction keypressed.

    Mais dans cette fonction je suppose que l'on va trouvé que keypressed dois avoir la valeur de getchar ou scanf ou je connais pas les autres.

    Donc

    Fonction traiter keypressed(variable : caractère)
    {
    Attend de lire qqchose sur le clavier (getchar ou scan..) // ici est le bug ******************

    ensuite met celle ci dans keypressed une fois avoir appyer sur "enter"

    }


    Voila le porblème c'est qu'il va attendre a chaque fois que l'on rentre une valeur (toute les secondes si on appui toutes les secondes sur une touche et Enter).

    Or justement j'aimerai que si on appui pas sur une touche il continue a boucler mais a ""ECOUTER"" le clavier si jamais on press sur une des trois touches tout en continuant a faire un refresh.
    Et donc si on appye pas sur les touche il refresh toute les secondes l'heure sans demander a chaque repassage de boucle d'entrer un valeur au clavier (a cause de getchar qui lui attend qqchose et ne laisse pas continuer la boucle).


    Donc résumer:
    -----------------
    Boucle toujours toute les secondes(pour afficher l'heure minutes/secondes) parallèlement au getchar qui peut être enfoncé que 1H00, 1 jour,..., après le lancement du programme pour quittez celui -ci ou faire pause ou autre chose.
    ***Donc le problème c'est que getchar attend que l'on presse au moin sur enter pour continuer la séquence du programme.

    Peut être qu'il y a une autre fonction qui va lire dans le buffer du clavier et donc lit ce qu'i y a dedant et mémorise dans une variable après le passage si qqchose.

  4. #4
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    tu dois utiliser les threads.
    un qui écoute les frappes du clavier. selon les frappes il pourra agir sur le thread qui affiche l'heure

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Voila ce que j'ai pour un C sous windows :

    #include<process.h>// pour le thread
    ....

    void _beginthread(ThreadProc, uiStackSize, pParam);

    Void procedureThread(void *param);

    Ensuite je ne vois pas trops

    Il faut creer deux threads qui font appel au paramètres ci dessu?

    Est-ce équivalent pour linux mode console avec Gcc? qui ne gère a mon avis pas de la même
    facon le uiStackSize...


    Et quelle include je dois mettre pour gcc.

    merci pour votre aide

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Points : 130
    Points
    130
    Par défaut fctnl
    regarde man fctnl
    cette fonction rend stdin non bloquant

  7. #7
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    En non-standard, il y a kbhit() qu indique si une frappe est en attente.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 235
    Points : 134
    Points
    134
    Par défaut
    Citation Envoyé par Musaran
    En non-standard, il y a kbhit() qu indique si une frappe est en attente.
    kbhit() sous linux.(GCC) ??? :o

  9. #9
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Citation Envoyé par cmarsc
    Citation Envoyé par Musaran
    En non-standard, il y a kbhit() qu indique si une frappe est en attente.
    kbhit() sous linux.(GCC) ??? :o
    nop existe pas cette fonction.

    va voir mon post qui va te permettre de gerer les touches
    c'est ici

    avec ca tu as déja le systeme pour recuperer les touches comme il fuat. ensuite il te reste plus qu'à mettre les deux threads en place. ce n'est pas bien long et compliqué.

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Voila j'ai essayer de chercher donc avec le programme ci -dessus, mais le problème c'est que la librairie ncurse est introuvable.

    J'utilise Gcc comme je suis débutant je sais pas donc si pour gcc c'est la même chose.

    Dans le header je déclare :

    #include <ncurses.h>
    j'ai essayer <curses.h>


    Peut être qu'il suffit juste de downloader ncurses.h et de le mettre dans include de gcc ou bien il faut peut etre proceder a une installation spécifique de cette librairie?

    J'ai trouvé sur le site de gnu les curses, mais dasn les packtage il y a plein de *curses** .h et je sais pas lesquelles sont bon pour gcc?

    Merci beaucoup pour votre aide. icon_smile.gif

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Sinon tu peux initialiser les signaux, genre quand tu fais ctrl-a ben il execute un handler.
    Cela se fait avec la gestion des terminaux termios.h, signal.h

  12. #12
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Moi j'essaierai un select() sur stdin

    vic

  13. #13
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Le principe des signaux c'est d'être interrompu de manière asynchrone donc quand tu feras par exemple un ctrl-a ben le programme execute le handler(qui n'est autre qu'une fonction particulière) et ensuite retourne à la ligne de code sur laquelle il a été interrompu.
    La fonction pour rediriger un signal est signal(SIGINT,handler);
    qui sur cet exemple à pour effet que quand le programme recois un SIGINT au lieu d'executé une fonction système, il execute les instructions de ton handler

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

Discussions similaires

  1. requête qui boucle sur une autre requête
    Par super_dz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/09/2006, 20h02
  2. boucle for qui ne marche pas
    Par Invité dans le forum Langage
    Réponses: 16
    Dernier message: 12/06/2006, 10h59
  3. [Tableaux] boucle while qui ne boucle pas comme je veux
    Par oceane751 dans le forum Langage
    Réponses: 5
    Dernier message: 05/06/2006, 00h42
  4. [FLASH MX2004] Animation qui boucle
    Par pok dans le forum Flash
    Réponses: 2
    Dernier message: 24/10/2005, 01h21
  5. Select qui boucle ou se termine par un Ora-01460
    Par PatriceP dans le forum Oracle
    Réponses: 4
    Dernier message: 29/10/2004, 08h53

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