Может быть глупый вопрос, но как один отображать прогресс в то время как работает программа?
Не так.
У вас есть несколько вопросов:
- Ваш
i
является неинициализированным, поэтому программа будет печатать мусор. (Исправлено: ->int i = 0;
)
- Ваш «счетчик прогресса» будет подсчитывать прогресс только во время цикла. Как только будет напечатан
Percent done: 100
, только цикл будет закончен.
- Вы печатаете 100 миллионов строк на консоль. Может, подумай об этом снова.
- С
(i*100)/to
вы получаете переполнение целых чисел примерно на полпути, поэтому вместо этого используйте i/(to/100)
. Обратите внимание, в зависимости от компилятора компилятор может оптимизировать это самостоятельно.
Чуть менее неприятны путь будет:
#include <stdio.h>
int main (void) {
int i = 0;
int to = 100000000;
while (i++ < to) {
if (i % 1000000 == 0) {
printf("\rPercent done: %d", i/(to/100));
}
dostuff();
}
printf("\rLoop finished");
return 0;
}
Обратите внимание, что это будет только точно отражать, насколько эта программа придет выполнение цикла. Любая работа до/после цикла не будет измерена этим.
Это только печатает консольное сообщение на каждый полный процент. Все еще неприятно, что вы получаете 100 консольных сообщений, но нигде не так плохо, как 100.000.000 (!) Звонков printf
. Тем не менее, это все равно влияет на производительность.
Это было бы медленно, как черт, но оно должно работать, когда вы инициализируете i. –
@KamiKaze, Как вы делаете живое? Где он обновляется? – Josh
Помимо того, что ваш код сломан, вы не можете делать то, что вы просите, с чистым стандартом C. Вам придется использовать консольный API для данной ОС, чтобы установить консольный курсор, где вам это нравится, а затем реализовать многопоточность , – Lundin