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 :

probleme de polling: le retour!


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut probleme de polling: le retour!
    Bonjour à tous!

    Je reviens sur le problème du polling, traité dans un précédent message: http://www.developpez.net/forums/d11...interruptions/

    Je voulais savoir si on pouvais m'éclaircir encore un peut les choses.

    Voici un exemple:
    je veux faire un programme qui affiche l'heure (en console). L'heure s'actualise 10 fois par seconde, et cela jusqu'à ce que je tape FIN dans la console.

    On voit qu'il y à une boucle infinie:
    while(1){
    printf("heure: %d\n",fonction_retournant_lHeure);
    }

    Bon, maintenant, il faut que je puisse faire une interruption,. En effet, si je mets getchar dans ma fonction, l'heure ne s'actualise pas.

    Comment faire alors pour que l'heure s'actualise, mais que si je tape FIN, le programme s'arrête?

    Je n'ai vraiment pas d'idée.

    Par avance merci

    PS: je précise que ce n'est pas un exo, c'est juste que je débute en C et j'apprends tout seul!

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je ne sais pas ce qu'il y a dans l'autre discussion mais en tout cas ton problème est déjà résolu par la FAQ.

    Comment intercepter une touche sans bloquer le programme (DOS/Windows) ?
    Comment intercepter une touche sans bloquer le programme (Unix) ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut
    Merci Melem,

    cependant, je ne comprends pas une chose:
    si je prend l'exemple de la fonction _kbhit, celle-ci m'informe quand une touche à été pressée.

    Mais donc, mon programme précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(1){
    printf("heure: %d\n",fonction_retournant_lHeure);
    }
    en un nouveau programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(1){
    utiliser fonction _khbit
    printf("heure: %d\n",fonction_retournant_lHeure);
    utiliser fonction _khbit
    }
    pour detecter la frappe d'une touche et faire l'action nécessaire.

    Mais, supposons qu'au moment ou je frappe la touche, le programme soit sur la ligne du printf, alors il ne sera pas sur le _khbit et donc, il ne saura pas que j'ai tapé sur une touche!

    Alors je pense qu'on va me dire que l'exécution de printf est très rapide, et donc que lorsqu'on intercepte une touche, même pendant printf, le programme sera passé sur la ligne suivante.

    Alors supposons que ma fonction retournant l'heure dans le printf soit très lente, alors le programme (durant l'execution) restera longtemps sur la ligne du printf, et si à ce moment je tappe sur une touche, et bien rien ne se passera!

    Pouvez-vous m'éclairer?

    Par avance merci!!!

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Mais, supposons qu'au moment ou je frappe la touche, le programme soit sur la ligne du printf, alors il ne sera pas sur le _khbit et donc, il ne saura pas que j'ai tapé sur une touche!
    Ca c'est ce que tu penses. Les prochaines fois, teste avant d'émettre des théories.

    Alors je pense qu'on va me dire que l'exécution de printf est très rapide, et donc que lorsqu'on intercepte une touche, même pendant printf, le programme sera passé sur la ligne suivante.
    Non on ne te le dira pas car cela ne pose aucun problème au code.

    Alors supposons que ma fonction retournant l'heure dans le printf soit très lente, alors le programme (durant l'execution) restera longtemps sur la ligne du printf, et si à ce moment je tappe sur une touche, et bien rien ne se passera!
    Ok, supposons alors que ta fonction printf mette 10 ans pour retourner. Ca te va 10 ans ? Lol. Supposons alors que 3 ans après le démarrage du printf, l'utilisateur revient sur son programme pour appuyer sur une touche quelconque du clavier. Alors le PC va enregitsrer cette action dans une mémoire interne au circuit électronique du clavier et quand dans 7 ans la fonction printf aura enfin retourné, le programme passera à l'instruction _kbhit. Que va faire _kbhit ? Et bien, elle va tout simplement regarder s'il y a une touche sauvegardée dans la mémoire dont je t'ai parlé et te répondra par oui ou non selon le cas.

    La fonction _kbhit ne supprime pas une touche de cette mémoire. Cela signifie que si une touche a été sauvegardée et que tu appelles _kbhit 10 fois, elle te répondra toujours par oui. Il ne faut pas croire que cela signifie que 10 touches ont été frappées. Il est donc conseillé de toujours retirer le caractère présent à chaque fois que _kbhit répond par oui pour ne pas se tromper soi-même. Cela peut se faire au moyen de la fonction _getch.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut
    Super, merci beaucoup Melem!
    Tu m'apprends plein de choses!

    Maintenant que j'ai compris ça, je me permets de te demander un peut près la même chose, mais en différent.

    Pour reprendre ton exemple, supposons que j'ai une fonction qui mette 10 ans à faire un printf.
    Et je voudrais que pour une raison ou une autre,(exemple: un changement d'année) mon printf se mette en pause, laisse la main à mon HELLO, le laisse s'exécuter, puis reprenne la main.

    Est-ce que cela est possible en C?
    Est-ce que l'unique solution est d'utiliser les threads? Ou peut on utiliser un système "interruptions"?

    Par avance merci!

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par morpheusmg Voir le message
    Est-ce que cela est possible en C?
    Oui


    Citation Envoyé par morpheusmg Voir le message
    Est-ce que l'unique solution est d'utiliser les threads?
    Non

    Il suffit d'utiliser "alarm" et les timers (setitimer par exemple)

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par morpheusmg Voir le message
    Super, merci beaucoup Melem!
    Tu m'apprends plein de choses!

    Maintenant que j'ai compris ça, je me permets de te demander un peut près la même chose, mais en différent.

    Pour reprendre ton exemple, supposons que j'ai une fonction qui mette 10 ans à faire un printf.
    Et je voudrais que pour une raison ou une autre,(exemple: un changement d'année) mon printf se mette en pause, laisse la main à mon HELLO, le laisse s'exécuter, puis reprenne la main.

    Est-ce que cela est possible en C?
    Est-ce que l'unique solution est d'utiliser les threads? Ou peut on utiliser un système "interruptions"?

    Par avance merci!
    Sous un système de type unix, tu peux utiliser alarm (plus simple d'utilisation mais moins souple et ne supporte que des temps en secondes) ou setitimer (plus puissante mais un poil plus compliqué à utiliser) comme te l'a dit souviron34. Sous Windows, c'est très compliqué dans une application console. Tu devras créer en plus du timer un thread, une fenêtre invisible (sauf si ça ne te dérange pas qu'on la voit) et gérer plein d'autres trucs. C'est mille fois plus simple dans une application fenêtrée où tu as en plus déjà une fenêtre et où il ne te reste donc plus qu'à mettre en place ton timer. Là, ça devient même plus simple que si lon était sous linux.

    A part ça, tu peux évidemment te débrouiller sans timers, avec des threads seulement par exemple mais ça veut dire que tu dois écrire toi-même ton temporisateur : du code en plus ...

    Quant à l'utilisation des interruptions (8h, 1Ch, ...), c'est trop viellot pour être encore utilisé de nos jours. Déjà dans un Windows ou Linux moderne, ça ne marchera pas. Ca peut t'être utile dans les seuls cas où tu programmes pour MS-DOS ou que tu es en train de réécrire MS-DOS ...

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

Discussions similaires

  1. picklist, arbre pose probleme lors d'un retour en arrière
    Par questionneuse dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 23/06/2011, 11h04
  2. Réponses: 1
    Dernier message: 17/02/2011, 09h14
  3. probleme de scintillement (le retour!)
    Par john stedd dans le forum VB.NET
    Réponses: 18
    Dernier message: 06/08/2008, 15h44
  4. RegExp : Problem avec ajout de retour a la ligne
    Par Roming22 dans le forum Linux
    Réponses: 3
    Dernier message: 12/01/2006, 19h44
  5. Réponses: 8
    Dernier message: 02/04/2004, 17h31

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