Comment faire un message clignotant sous C

Fermé
mimi.gsm Messages postés 45 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 15 novembre 2010 - 2 mars 2009 à 23:16
mamiemando Messages postés 33268 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 septembre 2024 - 3 mars 2009 à 20:50
Bonjour,
je programme sous turbo c 3.0 (windows xp)et je veux faire une sorte de menu avec une interface graphique(graphics.h) je me demande alors si c'est possible de faire un message clignotant , j'ai fait cet essai mais le probleme c'est que j'obtient une boucle infinie et sinon en ajoutant scanf pour saisir une touche le message ne clignote q'une seule fois. c'est clair que je suis debutante , j'ai entendu parler de threads mais franchement g rien compri ni de quoi ils s'agissent ni comment les utiliser ou où les mettre.
mon programme est comme suit :
while(1)
{
setcolor(0);
outtexxy(getmaxx()/8,getmaxy()/2,"Taper x pour continuer");
delay(500);
setcolor(15);
outtexxy(getmaxx()/8,getmaxy()/2,"Taper x pour continuer");
delay(500);
scanf("%c",&car);
if (car == 'x') menu(); /*menu() est une fonction qui affiche un menu simple dans ce cas elle nous fait retourner à un menu*/
}

beh voilà si quelqu'un peut tout simplement ajouter l'instruction appropriée .
Merci

3 réponses

mamiemando Messages postés 33268 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 septembre 2024 7 780
3 mars 2009 à 00:22
Les threads

Tu peux commencer par lire ceci :
https://fr.wikipedia.org/wiki/Processus_l%C3%A9ger

De manière intuitive un programme mono thread suit un seul fil d'exécution. Quand tu utilises des threads, tu as plusieurs fils d'exécutions qui s'exécutent simultanément. C'est typiquement ce qui est utilisé pour ne pas geler une interface pendant qu'une application fait un calcul (un thread pour l'interface graphique, un thread pour l'interface).

On peut multiplier le nombre de thread si un calcul peut être parallélisé : plusieurs processus (chaque thread) fait alors une partie du calcul. Il faut bien sûr que l'application soit prévue pour. Notamment il faut parfois faire des sections critiques, c'est-à-dire des sections de code où seul un thread peut passer simultanément (voir sémaphores et autres). Notamment c'est utile pour éviter que deux processus manipulent simultanément la même donnée.
http://fr.wikipedia.org/wiki/S%C3%A9maphore_(informatique)

Tu peux aussi regarder du côté de l'instruction fork en C pour créer plusieurs processus.
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/fork.2.html

Dans ton cas, il faudrait un thread pour le clignotement (l'interface), et une autre pour le calcul (j'attends que l'utilisateur saisisse son index par rapport à mon menu) si tu veux vraiment t'y prendre comme ça. Mais ce n'est pas la bonne approche dans ce cas très particulier !

Les séquences d'échappements

Une séquence d'échappement est une suite de caractère qui au lieu d'être écrite telle qu'elle est interprétée. Par exemple la séquence '\n' désigne dans la plupart des langages un retour à la ligne.

De la même façon, le style "clignotant" peut être obtenu en passant une séquence d'échappement bien trouvée, qui dépend fortement du shell que tu utilises. Si tu ne sais pas ce qu'est un shell lis ça :
http://fr.wikipedia.org/wiki/Shell_(informatique)

Par exemple si tu utilises une console bash ( voir https://en.wikipedia.org/wiki/Bash ) ou un terminal cygwin sous windows (voir https://fr.wikipedia.org/wiki/Cygwin ), il suffit de se référer à ce lien pour construire la séquence d'échappement adéquate :
http://jamiedubs.com/ps1-collection-customize-your-bash-prompt

Note qu'il existe plein de shells, par exemple sous linux il y a bash, tcsh, sh, ksh, zsh... Sous linux la plupart des gens utilisent bash. Cygwin utilise également bash.

L'instruction suivante (en bash) :
echo -e '\e[05;31mpouet\e[00m'

... écrit pouet en rouge clignotant sous linux (tu noteras que c'était parfaitement évident, la syntaxe parle d'elle même enfin !). L'instruction "echo -e" permet d'écrire le texte qui suit en évaluant ses éventuelles séquences d'échappement conformément au shell utilisé. Si tu installes linux ou cygwin et que tu tapes cette commande tu verras donc apparaître un pouet rouge clignotant apparaître.

Bon c'est très bien tout ça, mais les séquences d'échappement dépendent du shell et ce n'est pas forcément super intuitif. Heureusement, il y a la libraire ncurses qui permet de s'en affranchir :
https://fr.wikipedia.org/wiki/Ncurses

Conclusion : pas besoin de thread a priori, il faut juste trouver la séquence d'échappement qui va bien ou utiliser ncurses.

Bonne chance
0
mimi.gsm Messages postés 45 Date d'inscription dimanche 22 février 2009 Statut Membre Dernière intervention 15 novembre 2010 1
3 mars 2009 à 19:16
beh merci pour votre reponse mais est ce que c possible de faire ces séquences d'echapement sous windows avec l'interface graphique et puis j'aime garder le programme que g fait. a propos g entendu parlé de fonctions de saisie non blanquantes car c evident que le "scanf" est bloquant , donc voilà ya t'il une autre fonction de saisie non bloquante??? et c toujours sous windows(turbo c 3.0) et pas sous linux . merci
0
mamiemando Messages postés 33268 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 septembre 2024 7 780
3 mars 2009 à 20:50
Désolée mais je connais trop peu windows pour te dire, je peux juste te dire que les séquences d'échappement que je t'ai indiqué marchent sous cygwin (en fait tout ce que je t'ai indiqué sous linux marche dans un environnement cygwin sous windows, il faudrait juste vérifier comment se comporte le terminal de base windows).

Si tu veux un scanf non bloquant il faudra faire un thread ou une interface graphique (qui reposera sur un thread).

Bonne chance
0