2016-10-21 15 views
-2

Я хочу отобразить прогресс моей программы на C в процентах во время ее работы. Фактическая работа в программе, прогресс которой должен быть измерен, ограничен в цикле. Вот то, что я пробовал:Показывать ход выполнения во время выполнения программы

int i; 
int to = 100000000; 

while (i++ < to) { 
    printf("\rPercent done: %d", (100 * i)/to); 
} 
+1

Это было бы медленно, как черт, но оно должно работать, когда вы инициализируете i. –

+0

@KamiKaze, Как вы делаете живое? Где он обновляется? – Josh

+1

Помимо того, что ваш код сломан, вы не можете делать то, что вы просите, с чистым стандартом C. Вам придется использовать консольный API для данной ОС, чтобы установить консольный курсор, где вам это нравится, а затем реализовать многопоточность , – Lundin

ответ

7

Может быть глупый вопрос, но как один отображать прогресс в то время как работает программа?

Не так.

У вас есть несколько вопросов:

  • Ваш 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. Тем не менее, это все равно влияет на производительность.

Смежные вопросы