| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Прогресс бар в консоле |
| Автор: Ak47black 4.3.2010, 20:56 |
| Здравствуйте. Делаю консольную программу(клиент сервер), которая пересылает файл. Хочу сделать прогресс бар как-нибудь в консоле, но что-бы не сильно грузил процессор. Думаю сделать, чтобы что-бы он обновлялся только в тех случаях когда он будет менять свой облик. Зависимость у него хочу сделать - число пересланных бит от общего размера файла. Хотел-бы узнать как тут грамотней сделать? Какие функции можно применить? Я в работе с консолями мало что знаю. Кроме как на подобии printf, cout, ... |
| Автор: UniBomb 4.3.2010, 21:19 | ||
| Ak47black, выбираешь какой-нибудь символ, определяешь длину шкалы и с соответствующим дискретным шагом выводиш в строку выбранный символ. Например ты выбрал символ ▓ и 10 символов весь прогрессбар. каждый раз, когда ты получил 10% данных ты выводишь обычным printf (или через cout если ты на С++ пишешь) этот символ. Обычно в досе под это дело используют вот эти символы:
А там уже извращайся наводи эстетику как тебе вздумается. Второй вариант - выводить в одной и той же знаковой позиции по очереди символы "/", "-", "|", "\" а после них число процентов от принятого файла. Получается эффект вращающейся палочки, символизирующей что процесс идёт и программа не зависла. |
| Автор: andrew_121 4.3.2010, 21:40 | ||
![]() такой? вот.
|
| Автор: Веталька 4.3.2010, 22:29 | ||
заинтересовала тема, подскажите как это реализовать, все таки для консольки нужная вещь |
| Автор: andrew_121 4.3.2010, 22:47 |
что именно? все просто, как пять копеек. |
| Автор: Ak47black 4.3.2010, 22:53 |
| andrew_121, спасибо что поделились кодом. Но вот с моим проектом тут трудно применить, понимаете тут я это сразу несказал, мне нужно будет такую-же саму програму написать на java. Мне вот интересно как можно сделать так, чтобы например строка отражающая число была в одном месте консоли и при выполнении программы меняла значение? |
| Автор: bsa 5.3.2010, 01:13 |
| Ak47black, нужно пользоваться специальными кодами. Например, "\b" - возврат курсора на одну позицию назад. std::cout << std::flush - сброс буферов (отображение на консоль без необходимости отправки '\n'). |
| Автор: jhonyxakep 5.3.2010, 08:36 | ||
Или если под винду можно юзать conio.h. |
| Автор: cutwater 5.3.2010, 09:13 |
| jhonyxakep, можно но не нужно. так как deprecated и obsolete. Нужно пользоваться средствами API тогда уже. SetConsoleCursorPosition, etc. |
| Автор: jhonyxakep 5.3.2010, 10:30 |
Дык зачем юзать апи, если можно обойтись стандартными средствами, вдополнение зная что они еще и кроссплатформенные: (MinGW - GCC - Watcom - Borland) |
| Автор: bsa 5.3.2010, 11:05 |
| jhonyxakep, conio.h это совсем вещь не кроссплатформенная и тем более не стандартная. |
| Автор: jhonyxakep 5.3.2010, 11:40 | ||
|
| Автор: Веталька 5.3.2010, 15:46 | ||
как выводить символ в одно и то же место? читая тему увидел /b но вот вопрос а если у меня уже напечатано 10 строк? |
| Автор: bsa 5.3.2010, 15:58 |
| Веталька, а причем тут прогрессбар? В твоем случае придется использовать нестандартные механизмы. |
| Автор: Веталька 5.3.2010, 16:11 | ||||||
|
| Автор: andrew_121 5.3.2010, 16:30 |
ты притворяешься? |
| Автор: bsa 5.3.2010, 16:56 | ||||||||||||
Веталька, а в чем собственно проблема? Не знаешь как создать массив из 4-х символов?
Не знаешь, как узнать размер строки?
Не знаешь, как вывести строку?
Не знаешь, как вывести символы возврата курсора в нужном количестве?
Не знаешь как сбросить буфер консоли?
|
| Автор: Веталька 5.3.2010, 17:29 | ||
да, как не печально но я не притворяюсь |
| Автор: jhonyxakep 6.3.2010, 04:20 | ||
Да, уж, очень печально....
Вот так бы написал школьник (тк плохо алгоритм расчитан...) |
| Автор: bsa 6.3.2010, 10:40 | ||
jhonyxakep, действительно. Так бы написал школьник, у которого каша в голове из C и C++. Если пишешь на С++, то вместо snprintf следует использовать stringstream. Гораздо удобней, тем более, что заслать нужно количество '\b' можно так:
|
| Автор: jhonyxakep 7.3.2010, 07:30 |
| Автор: xvr 7.3.2010, 16:06 | ||
Никак. Все progress bar'ы (с использованием ТОЛЬКО стандартного вывода) будут работать в пределах одной строки, т.к. нет стандартного символа для перехода на ПРЕДЫДУЩУЮ строку (только на следующую) |