Консольный индикатор хода выполнения C++

Мне нравится иметь различные части моего запроса, выстраиваются в линию вертикально. Я склонен использовать размер вкладки 8 пробелов для SQL, который, кажется, работает хорошо.

SELECT  column1, 
        column2
FROM    table1
WHERE   column3 IN
(
        SELECT TOP(1) column4
        FROM    table2
        INNER JOIN table3
        ON      table2.column1  = table3.column1
)
7
задан kolrie 15 September 2009 в 03:26
поделиться

4 ответа

Очень простой способ сделать это - распечатать строку, за которой следует символ '\ r' . Это сам по себе возврат каретки, и на большинстве консолей он возвращает курсор в начало строки без перемещения вниз. Это позволяет вам перезаписать текущую строку.

Если вы пишете в stdout, cout или clog, не забудьте выполнить fflush или std :: flush потока, чтобы он немедленно выводил строку. Если вы пишете в stderr или cerr, тогда поток не буферизуется, и весь вывод выполняется немедленно (и неэффективно).

Более сложный способ сделать это - использовать библиотеку рисования экрана, такую ​​как curses. На консолях Windows есть и другие способы настройки их для прямой записи с экрана, но я не знаю, что это такое.

23
ответ дан 6 December 2019 в 05:43
поделиться

Вы можете попробовать что-то вроде:

void
spinner(int spin_seconds) {
    static char const spin_chars[] = "/-\\|";
    unsigned long i, num_iterations = (spin_seconds * 10);
    for (i=0; i<num_iterations; ++i) {
        putchar(spin_chars[i % sizeof(spin_chars)]);
        fflush(stdout);
        usleep(100000);
        putchar('\b');
    }
}

Конечно, это нестандартно из-за субсекундной usleep () , а я нет конечно, есть ли гарантия, что \ b стирает символ или нет, но это работает на большинстве платформ. Вы также можете попробовать \ r вместо этого, если \ b не помогает. В противном случае попробуйте найти версию curses .

Edit (образец curses)

Это должно помочь вам начать:

#include <curses.h>
#include <unistd.h>

void spinner(int spin_seconds) {
    static char const spin_chars[] = "/-\\|";
    unsigned long i, num_iterations = (spin_seconds * 10);
    for (i=0; i<num_iterations; ++i) {
        mvaddch(0, 0, spin_chars[i & 3]);
        refresh();
        usleep(100000);
    }
}

int main() {
    initscr();    /* initializes curses */
    spinner(10);  /* spin for 10 seconds */
    endwin();     /* cleanup curses */
    return 0;
}

Убедитесь, что вы установили ссылку с помощью -lcurses или -lncurses . Это должно работать в любой системе UNIX.

но он работает на большинстве платформ. Вы также можете попробовать \ r вместо этого, если \ b не помогает. В противном случае попробуйте найти версию curses .

Edit (образец curses)

Это должно помочь вам начать:

#include <curses.h>
#include <unistd.h>

void spinner(int spin_seconds) {
    static char const spin_chars[] = "/-\\|";
    unsigned long i, num_iterations = (spin_seconds * 10);
    for (i=0; i<num_iterations; ++i) {
        mvaddch(0, 0, spin_chars[i & 3]);
        refresh();
        usleep(100000);
    }
}

int main() {
    initscr();    /* initializes curses */
    spinner(10);  /* spin for 10 seconds */
    endwin();     /* cleanup curses */
    return 0;
}

Убедитесь, что вы установили ссылку с помощью -lcurses или -lncurses . Это должно работать на любой системе UNIX.

но он работает на большинстве платформ. Вы также можете попробовать \ r вместо этого, если \ b не помогает. В противном случае попробуйте найти версию curses .

Edit (образец curses)

Это должно помочь вам начать:

#include <curses.h>
#include <unistd.h>

void spinner(int spin_seconds) {
    static char const spin_chars[] = "/-\\|";
    unsigned long i, num_iterations = (spin_seconds * 10);
    for (i=0; i<num_iterations; ++i) {
        mvaddch(0, 0, spin_chars[i & 3]);
        refresh();
        usleep(100000);
    }
}

int main() {
    initscr();    /* initializes curses */
    spinner(10);  /* spin for 10 seconds */
    endwin();     /* cleanup curses */
    return 0;
}

Убедитесь, что вы установили ссылку с помощью -lcurses или -lncurses . Это должно работать на любой системе UNIX.

9
ответ дан 6 December 2019 в 05:43
поделиться

Вау, clipper , возможно, вы говорите о встроенных в язык элементах @ row, col? (Только риторический вопрос ...)

Вы можете создавать простые индикаторы выполнения с помощью printf: вы можете опустить завершающую новую строку. Очевидно, вы можете начинать или заканчивать строку с \ b, чтобы наложить символы. Таким образом легко сделать традиционный - \ | / kind.

Я помню, что в руководстве по пользовательскому интерфейсу Eclipse рекомендуются индикаторы прогресса независимо от того, сколько вы могли сказать о фактическом прогрессе. Я думаю, что теория заключалась в том, что все лучше, чем ничего, и просто делать все, что в ваших силах.

Единственная уловка, которая вам может понадобиться, - это потенциально обойти буферизацию строк. Обязательно fflush (stdout) после каждой операции вывода. (Или ostream :: flush ())

0
ответ дан 6 December 2019 в 05:43
поделиться

Boost имеет библиотеку прогресса, которая может помочь в некоторых из этих вещей

1
ответ дан 6 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: