отображение% выполнено при выполнении в C - PullRequest
4 голосов
/ 10 февраля 2011

У меня есть программа на C, выполнение которой занимает около 5 минут. Поэтому я подумал, могу ли я показать процент выполненных операций или какой-либо другой тип взаимодействия с пользователем во время выполнения, поскольку мигающий курсор немного скучный. Я думал об отображении процента, но могу ли я как-нибудь стереть, например, если задача 1 закончилась, я ставлю 25%, а после завершения задачи 2 25% становится 50%?

Дайте мне свой вклад в некоторые хорошие взаимодействия ура! =)

Ответы [ 8 ]

7 голосов
/ 10 февраля 2011

Это, по сути, два вопроса в одном:

  • Как рассчитать процент на основе потока задач
  • Как представить расчет

Первое зависит от того, как построена ваша программа, и, вероятно, на нее проще всего ответить, подумав о проблеме в контексте вашей программы. Второе можно сделать множеством способов, самые простые из которых уже были объяснены другими, а именно:

  • Использование \r для перехода к началу строки
  • Использование \b x количество раз для перемещения курсора назад

Я использовал третий способ, который еще не был упомянут, это сохранение и восстановление позиции курсора. Это позволяет произвольно перемещать курсор вокруг.

  • \e[s сохраняет текущую позицию курсора
  • \e[u восстанавливает курсор в эту позицию

Вот пример:

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char *argv[]) {

    int i;
    int tasks = 25;

    printf("Progress:\e[s");

    for(i = 0; i < tasks; i++) {
        int pct = ((float) i / tasks) * 100;

        printf(" %2d (%3d%%)\e[u", i, pct);
        fflush(stdout);

        sleep(1);
    }

    return(0);
}

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

Это решение предполагает, что ваш терминал способен понимать эти команды ANSI, которые могут отличаться от терминала к терминалу. Хотя я думаю, что вышеупомянутый подход является относительно «безопасным», посмотрите на terminfo / ncurses , чтобы узнать больше об этом.

Changelog:

  • переписал последний абзац
  • Заменил мой первоначальный пример bash на пример C
5 голосов
/ 10 февраля 2011

При печати в консоли вы можете использовать специальный символ "\ r", который, как следует из его названия (возврат каретки), устанавливает курсор на первый символ в текущей строке.

Вы можетезатем перезаписать предыдущее процентное значение, если вы не печатаете символ «\ n» и убедитесь, что новая печатаемая строка по крайней мере такая же, как и предыдущая.

Что яЭто означает, например, что вы печатаете «25,5% \ r», а затем «26% \ r», на вашем дисплее будет отображаться что-то вроде

26 % %

Чтобы убедиться, что это не такв противном случае выведите несколько пробелов между% и \ ​​r.

1 голос
/ 10 февраля 2011

Это позволяет печатать на одной строке с возвратом в начало:

printf("\b\b\b%02d%%", percent);

Т.е. отступить на 3 знака (если есть) и затем напечатать ровно 3 символа.

1 голос
/ 10 февраля 2011

Просто разделите задачи, которые вы выполнили, на общее количество задач, которые вам нужно выполнить, и у вас будет процент (если вы хотите удалить число из числа * это на 100)

1 голос
/ 10 февраля 2011

Используйте int, который хранит количество выполненных задач, и вызывайте printf как-то так каждый раз, когда вы выполняете задачу:

printf("Completed: %d %%\r", tasks_completed * 25);
1 голос
/ 10 февраля 2011

Вы можете использовать \r, чтобы сбросить курсор в начало строки, а затем перепечатать оператор поверх текущего текста.

0 голосов
/ 10 февраля 2011

Иногда бывает сложно разделить код, скажем, на 100 частей, чтобы отобразить% выполнения. В таких случаях вы можете включить «системное время» в учетную запись.

время записи, выполненное в предыдущем исполнении, в файл. установите этот период времени на 100% и напечатайте процент выполнения в соответствии с временем, прошедшим с помощью доступа к системным часам. Синхронизируйте процент выполнения в некотором интервале, например, 25% или 50%, с фактическим выполнением программы.
наконец, покажите печать 100% до фактического завершения программы. во всяком случае, это просто другой взгляд.

0 голосов
/ 10 февраля 2011

Не забудьте промыть.Вы можете напечатать только точку.

printf(".");fflush(stdout);

Но вы также можете сделать это (\ b - возврат).

printf("%02d%%\b\b\b",score);fflush(stdout);
...