Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прогресс бар в консоле 
:(
    Опции темы
Ak47black
  Дата 4.3.2010, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Делаю консольную программу(клиент сервер), которая пересылает файл.
Хочу сделать прогресс бар как-нибудь в консоле, но что-бы не сильно грузил процессор.
Думаю сделать, чтобы что-бы он обновлялся только в тех случаях когда он будет менять свой облик.
Зависимость у него хочу сделать - число пересланных бит от общего размера файла.
Хотел-бы узнать как тут грамотней сделать?
Какие функции можно применить?
Я в работе с консолями мало что знаю. Кроме как на подобии printf, cout, ...
PM MAIL   Вверх
UniBomb
Дата 4.3.2010, 21:19 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 97



Ak47black, выбираешь какой-нибудь символ, определяешь длину шкалы и с соответствующим дискретным шагом выводиш в строку выбранный символ.

Например ты выбрал символ ▓ и 10 символов весь прогрессбар.  каждый раз, когда ты получил 10% данных ты выводишь обычным printf (или через cout если ты на С++ пишешь) этот символ.

Обычно в досе под это дело используют вот эти символы:

Цитата

░ ▒ ▓


А там уже извращайся наводи эстетику как тебе вздумается.

Второй вариант - выводить в одной и той же знаковой позиции по очереди символы "/", "-", "|", "\" а после них число процентов от принятого файла. Получается эффект вращающейся палочки, символизирующей что процесс идёт и программа не зависла.

Это сообщение отредактировал(а) UniBomb - 4.3.2010, 21:22
PM MAIL ICQ Skype   Вверх
andrew_121
Дата 4.3.2010, 21:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



user posted image
такой?

вот.
Код

#include <iostream>
#include <string>
#include <unistd.h>

class console_progress_bar {
public:
    explicit console_progress_bar(int expected_count,
                             std::ostream& os,
                             const std::string& s1 = "\n",
                             const std::string& s2 = "",
                             const std::string& s3 = "" )
   : _stream(os), _str1(s1), _str2(s2), _str3(s3) {
      restart(expected_count);
   }
    ~console_progress_bar() {}

   void restart(int expected_count) {
      _count = _next_tic_count = _tic = 0;
      _expected_count = expected_count;

      _stream  << _str1 << "0%   10   20   30   40   50   60   70   80   90   100%\n"
               << _str2 << "|----|----|----|----|----|----|----|----|----|----|"
               << std::endl  << _str3;
      if ( !_expected_count )
         _expected_count = 1;
   }
   int operator+=(int increment) {
      if ( (_count += increment) >= _next_tic_count ) {
         display_tic();
      }
      return _count;
   }

   int operator++()           { return operator+=( 1 ); }
   int count() const          { return _count; }
   int expected_count() const { return _expected_count; }
private:
   std::ostream& _stream;
   const std::string  _str1;
   const std::string  _str2;
   const std::string  _str3;
   int _count;
   int _expected_count;
   int _next_tic_count;
   int _tic;
    /**/
   void display_tic() {
      int tics_needed = static_cast<int>( (static_cast<double>(_count)/_expected_count)*50.0 );
      do {
         _stream << "*";
         _stream.flush();
      } while ( ++_tic < tics_needed );
      _next_tic_count = static_cast<int>((_tic/50.0)*_expected_count);
      if ( _count == _expected_count ) {
         if ( _tic < 51 )
            _stream << "*";
         _stream << std::endl;
      }
   }
};

/*******************************************************/

int main() {
    const int max = 100;
    console_progress_bar progress(max, std::cout);

    for ( int idx = 0; idx < max; ++idx ) {
        ++progress;
        sleep(1);
    }
    
    return 0;
}



Это сообщение отредактировал(а) andrew_121 - 4.3.2010, 22:11


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Веталька
Дата 4.3.2010, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: нет
Всего: 6



Цитата

Второй вариант - выводить в одной и той же знаковой позиции по очереди символы "/", "-", "|", "\" а после них число процентов от принятого файла. Получается эффект вращающейся палочки, символизирующей что процесс идёт и программа не зависла.


заинтересовала тема, подскажите как это реализовать, все таки для консольки нужная вещь


--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
andrew_121
Дата 4.3.2010, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(Веталька @  4.3.2010,  22:29 Найти цитируемый пост)
подскажите как это реализовать

что именно? все просто, как пять копеек.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Ak47black
Дата 4.3.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



andrew_121, спасибо что поделились кодом.
Но вот с моим проектом тут трудно применить, понимаете тут я это сразу несказал, мне нужно будет такую-же саму програму написать на java.

Мне вот интересно как можно сделать так, чтобы например строка  отражающая число была в одном месте консоли и при выполнении программы меняла значение?
PM MAIL   Вверх
bsa
Дата 5.3.2010, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Ak47black, нужно пользоваться специальными кодами. Например, "\b" - возврат курсора на одну позицию назад. std::cout << std::flush - сброс буферов (отображение на консоль без необходимости отправки '\n').
PM   Вверх
andrew_121
Дата 5.3.2010, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(Ak47black @  4.3.2010,  22:53 Найти цитируемый пост)
Мне вот интересно как можно сделать так, чтобы например строка  отражающая число была в одном месте консоли и при выполнении программы меняла значение? 

Код

void myprint(const char* str) {
   fprintf(stdout, "\r%80c\r%s", ' ', str);
}


Добавлено через 1 минуту и 5 секунд
Цитата(Ak47black @  4.3.2010,  22:53 Найти цитируемый пост)
мне нужно будет такую-же саму програму написать на java

и в чем проблема? легко переписывается.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
jhonyxakep
Дата 5.3.2010, 08:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



Цитата(bsa @  5.3.2010,  01:13 Найти цитируемый пост)
Ak47black, нужно пользоваться специальными кодами. Например, "\b" - возврат курсора на одну позицию назад. std::cout << std::flush - сброс буферов (отображение на консоль без необходимости отправки '\n').

Или если под винду можно юзать conio.h.
PM MAIL ICQ   Вверх
cutwater
Дата 5.3.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



jhonyxakep, можно но не нужно. так как deprecated и obsolete. Нужно пользоваться средствами API тогда уже.

SetConsoleCursorPosition, etc.


--------------------
user posted image
PM MAIL   Вверх
jhonyxakep
Дата 5.3.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



Цитата(cutwater @  5.3.2010,  09:13 Найти цитируемый пост)
SetConsoleCursorPosition, etc.

Дык зачем юзать апи, если можно обойтись стандартными средствами, вдополнение зная что они еще и кроссплатформенные: (MinGW - GCC - Watcom - Borland)

PM MAIL ICQ   Вверх
bsa
Дата 5.3.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



jhonyxakep, conio.h это совсем вещь не кроссплатформенная и тем более не стандартная.
PM   Вверх
jhonyxakep
Дата 5.3.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



Цитата(bsa @  5.3.2010,  11:05 Найти цитируемый пост)
jhonyxakep, conio.h это совсем вещь не кроссплатформенная и тем более не стандартная.

 smile Ладн, сорь, но ето я просто предложил как вариант
PM MAIL ICQ   Вверх
Веталька
Дата 5.3.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008

Репутация: нет
Всего: 6



Цитата

что именно? все просто, как пять копеек.


как выводить символ в одно и то же место?

читая тему увидел /b но вот вопрос а если у меня уже напечатано 10 строк?



--------------------
Ради зачета студент идет на все, даже на лекции........................ 
PM MAIL ICQ   Вверх
bsa
Дата 5.3.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Веталька, а причем тут прогрессбар? В твоем случае придется использовать нестандартные механизмы.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.