8
votes

curseur clignotant enlèvement dans le terminal, comment?

J'utilise les lignes suivantes pour émettre des informations de progression de la simulation dans mon programme C ++, xxx

Ça fonctionne bien!

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?

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?

Merci!


0 commentaires

6 Réponses :


0
votes

Ces applications utilisent probablement nCurses . Voir mvaddstr


1 commentaires

Wget et FBI sont deux exemples de programmes qui n'utilisent pas les ncurses, mais sont capables de cacher complètement le curseur.



12
votes

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");


4 commentaires

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!");



21
votes

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


2 commentaires

Vous voulez dire dans la boucle, après cette commande printf ("\ r [% 6.4f %%]", pourcentage); ?


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 si vous voulez.



1
votes

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:

  • Après avoir caché le curseur et modifier l'écran, avant montrant à nouveau le curseur déplacer retour à l'emplacement d'origine.
  • cacher / montrer le curseur ne maintient que le curseur de clignoter sensiblement lorsque vos mises à jour ne prennent qu'une petite quantité de temps. Si vous avez mixé cela avec un processus de consommation de temps, votre curseur sera clignoter.

    la solution suggérée à l'aide de setterm n'est pas portable; Il est spécifique à la console Linux. Et exécuter un exécutable à l'aide de système n'est pas vraiment nécessaire. Mais même en cours d'exécution xxx

    est une amélioration par rapport à l'utilisation de setterm .

    Vérification du code source de 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.

    Au fait - cette technique de masque de curseur est utilisée dans les pilotes de terminal pour certains éditeurs (VIM et vile ).


1 commentaires

Je pense que la raison actuelle de la raison pour laquelle wget n'a pas que ce problème est parce qu'ils impriment sur starr qui est non forcé, au lieu de stdout qui est tamponné.



-1
votes

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


0 commentaires

-2
votes

Appuyez sur la touche d'insertion ... Si cela ne fonctionne pas, appuyez sur la touche FN dans votre clavier. Cela fonctionnera certainement
J'espère que cela aide


0 commentaires