Форум программистов, компьютерный форум CyberForum.ru

Простейшая индикация выполнения в консоли. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.95
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
09.09.2011, 11:01     Простейшая индикация выполнения в консоли. #1
Привет всем форумчанам!

Пишу небольшую консольную утилитку.
В конце отладки выяснилось что трудно догадаться чем в данный момент занимается утилита.

Встал вопрос реализации некой анимации - индикатора выполнения. Например крутящийся "/".

Как это лучше реализовать?

Заранее спасибо!
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 11:20     Простейшая индикация выполнения в консоли. #2
Перемещать курсор в заданную позицию и выводить последовательно символы \ | / -
Как переводить курсор зависит от используемой IDE и библиотек. В соседних темах поищи.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
09.09.2011, 11:22     Простейшая индикация выполнения в консоли. #3
Вот.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <windows.h>
 
int  main(void) {
 
    HANDLE hout     = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD dw        = 0u;
    char  cadr[]    = "-\\|/"; 
    const char* ptr;
 
    COORD pos = { 10, 10 }; // позиция вывода анимации
    while(1) {
            for(ptr = cadr; *ptr != '\0'; *ptr++) {
                   FillConsoleOutputCharacter(hout, *ptr, 1u, pos, &dw);
                   Sleep(200u);
            }
    }
    return 0;
}
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
09.09.2011, 11:42  [ТС]     Простейшая индикация выполнения в консоли. #4
Как переводить курсор зависит от используемой IDE и библиотек. В соседних темах поищи.
VS2008. ну и есс-на iostream и windows.h. В темах с основном пишут про мышиный курсор.


Код
COORD pos = { 10, 10 }; // позиция вывода анимации
А как узнать предыдущую позицию курсора?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 11:53     Простейшая индикация выполнения в консоли. #5
Цитата Сообщение от NWR Посмотреть сообщение
как узнать предыдущую позицию курсора?
GetConsoleScreenBufferInfo

И прочее
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
09.09.2011, 12:01     Простейшая индикация выполнения в консоли. #6
Цитата Сообщение от Deviaphan Посмотреть сообщение
Как переводить курсор зависит от используемой IDE и библиотек.
C++
1
cout << '\b';
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 12:13     Простейшая индикация выполнения в консоли. #7
Это удалит последний введённый символ.
А если изменить нужно первый символ или в середине? Тогда уж проще вообще всё перепечатать.)

Добавлено через 2 минуты
Цитата Сообщение от NWR Посмотреть сообщение
В конце отладки выяснилось что трудно догадаться чем в данный момент занимается утилита.
Может, лучше выводить проценты или даже текстовые описания текущих действий?
Простой \|/- не сделает понятнее. Будет лишь ясно, что не подвисла программа.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
09.09.2011, 12:20     Простейшая индикация выполнения в консоли. #8
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это удалит последний введённый символ.
Это переместит курсор на один символ назад.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
09.09.2011, 12:23     Простейшая индикация выполнения в консоли. #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Опаньки http://www.boost.org/doc/libs/1_41_0...imer/timer.htm
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 12:26     Простейшая индикация выполнения в консоли. #10
Класс! Не знал про таймер.) Надо получше в бусте покопаться, ещё вкусняшек поискать.)
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
09.09.2011, 15:42  [ТС]     Простейшая индикация выполнения в консоли. #11
GetConsoleScreenBufferInfo
О! Попробую. Спассибо!

Может, лучше выводить проценты или даже текстовые описания текущих действий?
Простой \|/- не сделает понятнее. Будет лишь ясно, что не подвисла программа.
Тогда заодно перед крутилкой еще и какую нибудь тектовуху буду выводить. Теперь во всеорудии))

Добавлено через 2 часа 27 минут
UPD.

Возникла неожиданная проблема в самом конце. не связано с выводом на экран, но чтобы не плодить темы спрошу здесь.

Почему метод close из fstream вызывает исключение?

у меня вызывается несколько файлов. и при закрытии одного из них происходит вылет с исклюением.
код типа этого
Код
ifstream Myfile ("file.type");
...
...
...
Работа с файлом
...
...
..
Myfile.close();
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 15:48     Простейшая индикация выполнения в консоли. #12
Файл не был открыт. Был закрыт до этого. Была ошибка в процессе чтения. Мало ли что.
Если у тебя не допотопный компилятор, то может и не быть потребности в явном вызове close(), но в нормальных условиях должно было нормально закрыться поток.
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
09.09.2011, 16:26  [ТС]     Простейшая индикация выполнения в консоли. #13
Если у тебя не допотопный компилятор, то может и не быть потребности в явном вызове close(),
конкретно для этого файла я close и не вызывал.
Однако в конце всех манипуляций мне нужно удалить этот файл.
А DeleteFile не удаляет, возвращает NULL.Вот я и решил что нужно б закрыть для начала. И все, приехал.


А в процессе работы я его всего лишь считываю посимвольно (get) до самого конца и все.

Добавлено через 33 минуты
Нет, я все равно не вкурю.

Код
		loop_reading: //начало цикла чтения файла

		cout << progress_symbol[pos];
		cout << '\b';
		
		if(++wait_to_change > 10)
		{
			wait_to_change = 0;
			if(++pos > 3)
				pos = 0;		
		}
		
		int symb_position;
		symb_position = 0;
		
		ifstream DataLog("DATA.log");

		if(!DataLog)
		{
			goto loop_reading;
		}
		
		
		cond_file_size = 0;
		
		for(;!DataLog.eof();)
		{
			str1[symb_position] = DataLog.get();
			
			cond_file_size++;
			
			if(++symb_position >= sizeof(str1))
			{
				for(int s = 0; s < (sizeof(str1) - 1); s++)
				   str1[s] = str1[s+1];
				
			 symb_position--;
			}
		}
		
		DataLog.close();
...
Вот чему здесь уходить в exception?..
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 17:02     Простейшая индикация выполнения в консоли. #14
Цитата Сообщение от Deviaphan Посмотреть сообщение
Если у тебя не допотопный компилятор
Deviaphan, а разве от компилятора это зависит?

NWR, код, который выбрасывает исключение, окружите блоком try ... catch(), поймайте нужное вам исключение. У всех объектов исключения STL есть функция what(), которая возвращает char* на строку с объяснением ошибки.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 17:05     Простейшая индикация выполнения в консоли. #15
Цитата Сообщение от talis Посмотреть сообщение
а разве от компилятора это зависит?
Как выяснилось в соседней теме, Borland C++ for DOS не закрывает поток в деструкторе.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.09.2011, 17:55     Простейшая индикация выполнения в консоли. #16
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <unistd.h>
 
int main(void){
    const char buf[] = "-\\|/";
    int percents;
    
    for ( percents = 0; percents < 100; ++percents ){
        printf("%c %02d%%", buf[percents % 4], percents);
        fflush(stdout);
        usleep(500000);
        printf("\b\b\b\b\b");
    }
    printf("Done.\n");
    
    return 0;
}
Ну, соответственно, вместо unistd.h - windows.h, вместо usleep() - Sleep()...


Цитата Сообщение от NWR Посмотреть сообщение
C++
1
for(;!DataLog.eof();)
А файл читается правильно?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
10.09.2011, 03:13     Простейшая индикация выполнения в консоли. #17
Цитата Сообщение от NWR Посмотреть сообщение
Вот чему здесь уходить в exception?..
А точно его вызывает close?

Цитата Сообщение от NWR Посмотреть сообщение
C++
1
2
3
4
if(!DataLog)
 {
    goto loop_reading;
 }
Жесть... файл не может открыться по какой-либо причине, допустим отсутствие такового на диске, в результате с такой конструкцией получим вечный цикл, но зато с анимацией бурной деятельности
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
10.09.2011, 08:55  [ТС]     Простейшая индикация выполнения в консоли. #18
Цитата Сообщение от easybudda Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <unistd.h>
 
int main(void){
    const char buf[] = "-\\|/";
    int percents;
    
    for ( percents = 0; percents < 100; ++percents ){
        printf("%c %02d%%", buf[percents % 4], percents);
        fflush(stdout);
        usleep(500000);
        printf("\b\b\b\b\b");
    }
    printf("Done.\n");
    
    return 0;
}
Ну, соответственно, вместо unistd.h - windows.h, вместо usleep() - Sleep()...



А файл читается правильно?
Индикация выполнения отрабатывает. С этим проблем нет. И файл читается на удивление правильно.

А точно его вызывает close?
Catchить пока не пробовал. Просто если закоментраить закрытие то нет и исключения.

Жесть... файл не может открыться по какой-либо причине, допустим отсутствие такового на диске, в результате с такой конструкцией получим вечный цикл, но зато с анимацией бурной деятельности
))) Не не не. Файл все равно так или иначе там появится)
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
10.09.2011, 09:05     Простейшая индикация выполнения в консоли. #19
Цитата Сообщение от NWR Посмотреть сообщение
Не не не. Файл все равно так или иначе там появится)
отсутствие файла на диске это одна из многих причин. В любом случае эта часть кода бессмысленна.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2011, 09:39     Простейшая индикация выполнения в консоли.
Еще ссылки по теме:

C++ простейшая программа C++
C++ Простейшая структура
C++ считывание с консоли ( не с клавы, а именно с консоли)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
10.09.2011, 09:39  [ТС]     Простейшая индикация выполнения в консоли. #20
отсутствие файла на диске это одна из многих причин. В любом случае эта часть кода бессмысленна.
Просто в нормальных условиях файл появится в папке раньше чем откроется поток. Если вдруг не успел, то нужно дождаться....


Мля. Оказалось что после чтения, исключение способны вызвать еще и clear и seekg(0,ios::beg). Что за грабли такие...Пошел делать catch...
Yandex
Объявления
10.09.2011, 09:39     Простейшая индикация выполнения в консоли.
Ответ Создать тему
Опции темы

Текущее время: 05:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru