8
votes

Console C ++ Indicateur de progression de la console

Quel serait un moyen facile d'implémenter un indicateur de progression basé sur la console pour une tâche en cours d'exécution, mais je ne peux pas anticiper combien de temps cela prendrait?

J'avais l'habitude de le faire lorsque j'ai codé dans Clipper, et ce n'était qu'une question d'itération à travers les caractères '/', '-', '\', '|' ' et les positionnez au même endroit.

Toute voie / liens / libs pour le faire (ou quelque chose de similaire) en C ++?

La cible pour cela concerne les environnements * Nix.

Edits:

  • a changé le titre pour être plus cohérent et plus générique;
  • Ajout de l'environnement cible.

3 commentaires

Qu'est-ce qui vous empêche de faire la même chose dans une application C ++ Console?


@Tal: Je suis une sorte de débutant dans les applications C ++ et Console, je pourrais donc utiliser quelqu'un qui me dirige dans la bonne direction avec métacode ou un bon lien sur le subect.


Stackoverflow.com / Questions / 1365317 / ...


4 Réponses :


24
votes

Un moyen très simple de le faire est d'imprimer une chaîne suivie d'un '\ r' . C'est le retour du chariot par lui-même et sur la plupart des consoles, il renvoie le curseur au début de la ligne sans descendre. Qui vous permet d'écraser la ligne actuelle.

Si vous écrivez sur STDOUT ou COUT ou SCÂLEZ N'oubliez pas de FLUSH ou de STD :: Rincer le flux pour le rendre immédiatement émis. Si vous écrivez sur STDERR ou CERR, le flux est absorbé et toute la sortie est immédiate (et inefficace).

Un moyen plus compliqué de le faire consiste à utiliser une bibliothèque de dessin à l'écran comme des malédictions. Les consoles Windows ont d'autres moyens de les définir pour une écriture directe à l'écran, mais je ne sais pas ce qu'ils sont.


4 commentaires

Merci Zan, le conseil «\ r» sonne la peine d'essayer!


Comme Zan suggérait, j'utiliserais des malédictions. Une recherche rapide du "tutoriel des malédictions" vous obtiendra exactement ce dont vous avez besoin ...


La solution \ r a fonctionné et est exactement ce dont j'avais besoin - le cas le plus simple qui fonctionne.


Si l'on partne pour une solution spécifique à Windows, il ne sert à rien de gêner avec conio.h (car il est spécifique de la plate-forme de toute façon) - utilisez simplement des fonctions de console d'API Win32.



9
votes

Vous pouvez essayer quelque chose comme: xxx

bien sûr, ceci est non standard en raison de la sous-seconde USLEeP () et je ne suis pas sûr S'il y a une garantie que \ b efface un personnage ou non, mais cela fonctionne sur la plupart des plates-formes. Vous pouvez également essayer \ r si \ b ne fait pas le tour. Sinon, essayez de trouver une version de malédiction .

Edit (Échantillon des curies)

Cela devrait vous aider à démarrer: xxx

Assurez-vous de créer un lien avec l'un des -lcurses ou -lncurses . Cela devrait fonctionner sur n'importe quel unix de la sorte là-bas.


1 commentaires

Incroyable, merci beaucoup pour cela. Je ferai des expériences avec cela avec l'apprentissage, car la solution \ r suffisait pour moi. C'est la seule raison qui m'a empêché de choisir votre - expliquée à fond - réponse. Merci!



0
votes

WOW, CLIPPER , vous parlez peut-être de la ligne @ @ Col Les choses construites dans la langue? (Question rhétorique seulement ...)

Vous pouvez faire de simples barres de progression avec Printf: vous pouvez laisser la nouvelle ligne de fuite. Vous pouvez évidemment commencer ou mettre fin à la chaîne avec \ B afin de surprendre les caractères. Il est facile de faire le traditionnel - \ | / gentil de cette façon.

Je me souviens que les lignes directrices de l'interface utilisateur Eclipse recommandaient des indicateurs de progrès, quel que soit le montant que vous avez pu parler des progrès réels. Je pense que la théorie était que tout est meilleur que rien et de faire de tout ce que vous pouvez.

Le seul tour que vous êtes susceptible d'avoir besoin est potentiellement pour vaincre la mise en mémoire tampon de la ligne. Assurez-vous de fflush (stdout) après chaque opération de sortie. (Ou ostream :: flush ())


2 commentaires

Si cela ne vous dérange pas que je réponde à votre question rhétorique, oui, nous faisions quelque chose comme ça. Bonne vieille campeur :-)


Je me demandais pourquoi le mien travaille sans chasse, puis j'ai réalisé que j'utilise Stdrr, qui est ignorée.



1
votes

Boost a une bibliothèque de progrès qui peut aider certaines de ces choses


0 commentaires