J'utilise les lignes suivantes pour émettre des informations de progression de la simulation dans mon programme C ++, Ça fonctionne bien! p> mais le problème est que je vois le curseur terminal continue de clignoter de manière cyclique à travers les chiffres, c'est très gênant, tout le monde sait se débarrasser de cela? P> J'ai vu des programmes comme Wget ou Ubuntu apt, ils utilisent également des barres de progression ou des pourcentages Ne semble pas une question de curseur clignotant, je me demande comment a-t-il fait cela? P> Merci! P> P>
6 Réponses :
Juste une supposition: essayez d'utiliser un bon nombre de caractères «\ B» (arrière) au lieu de «\ r».
== EDIT == P>
Je ne suis pas un assistant de coque Linux, mais cela peut fonctionner: p>
system("setterm -cursor off"); // ...display percentages... system("setterm -cursor on");
Pourquoi avez-vous besoin des percents? Vous pouvez simplement écrire des caractères '#', l'un après l'autre. Par exemple, un «#» pour chaque nouveau 10% s.
Oups, j'aime les chiffres :) D'accord, je vais essayer # et vous laisser savoir les résultats, mais de toute façon, juste un google, quelqu'un a dit wget n'a pas utilisé de nûts
Oups, semble-t-il une fois qu'il a été éteint, il ne pouvait plus être retourné
L'utilisation du système est mauvaise. Le programme exécuté après la fourche fera ce Stackoverflow.com/a/10995085/78712 . Est-ce que ça va par toi? système ("echo bonjour world!"); code>
Vous pouvez masquer et afficher le curseur à l'aide du mode DectCEM CODE> (Mode d'activation du curseur de texte Dec) dans
DecSM code> et
DRENM code>:
fputs("\e[?25l", stdout); /* hide the cursor */
fputs("\e[?25h", stdout); /* show the cursor */
Vous voulez dire dans la boucle, après cette commande printf ("\ r [% 6.4f %%]", pourcentage); code>?
Partout où ils sont nécessaires. Généralement, vous masquez le curseur avant toutes les mises à jour, effectuez toutes les mises à jour, puis le montrer à nouveau à la fin. Vous pouvez même les combiner tous dans un printf code> si vous voulez.
Un moyen d'éviter un curseur clignotant est (comme suggéré) de masquer temporairement le curseur.
Cependant, ce n'est qu'une partie de la solution. Votre programme devrait également en tenir compte: P>
la solution suggérée à l'aide de est une amélioration par rapport à l'utilisation de Vérification du code source de Au fait - cette technique de masque de curseur est utilisée dans les pilotes de terminal pour certains éditeurs (VIM et vile ). p> p> setterm code> n'est pas portable; Il est spécifique à la console Linux. Et exécuter un exécutable à l'aide de
système code> n'est pas vraiment nécessaire. Mais même en cours d'exécution p>
setterm code>. P>
wget < / code> ne trouve pas de séquences d'échappement cachées du curseur. Ce que vous voyez avec sa barre de progression, c'est qu'il laisse le curseur à peu près le même endroit chaque fois que cela prend quelque chose de temps. La sortie du terminal prend si peu de temps que vous ne remarquez pas la réécriture momentanée de la ligne (en imprimant un retour de chariot, puis écrivez la plus grande partie de la ligne). Si elle était plus lente, puis cachez le curseur aiderait - jusqu'à un point. P>
Je pense que la raison actuelle de la raison pour laquelle wget code> n'a pas que ce problème est parce qu'ils impriment sur
starr code> qui est non forcé, au lieu de
stdout code> qui est tamponné.
La raison pour laquelle le curseur saute autour est parce que stdout code> est tamponné, de sorte que vous ne savez donc pas combien de caractères sont imprimés à un moment donné. La raison
wget code> n'a pas de curseur de saut d'obstacles est qu'ils sont en train d'imprimer en réalité sur
stardr code> à la place, ce qui est ignoré. Essayez ce qui suit:
$ ./executable > log.data
Appuyez sur la touche d'insertion ... Si cela ne fonctionne pas, appuyez sur la touche
J'espère que cela aide p>