курсор мигает удаление в терминале, как?

Я использую следующие строки для вывода информации о ходе моего моделирования в моей программе c++,

double N=0;
double percent=0;
double total = 1000000;
for (int i; i<total; ++i)
{
    percent = 100*i/total;
    printf("r[%6.4f%%]",percent);
}

Он работает отлично!

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

Я видел некоторые программы, такие как wget или ubuntu apt, они также используют индикатор выполнения или проценты, но они не кажутся проблемой мигающего курсора, мне интересно, как они это сделали это?

спасибо!

6 ответов


просто предположение: попробуйте использовать правильное количество символов "\b "(backspace) вместо "\r".

= = EDIT ==

Я не мастер оболочки Linux, но это может работать:

system("setterm -cursor off");
// ...display percentages...
system("setterm -cursor on");

не забудьте #include <cstdlib> или <iostream>.


вы можете скрыть и показать курсор с помощью DECTCEM (DEC text cursor enable mode) режим в DECSM и DECRM:

fputs("\e[?25l", stdout); /* hide the cursor */

fputs("\e[?25h", stdout); /* show the cursor */

эти приложения, наверное, используя ncurses. См.mvaddstr


один из способов избежать мигания курсора (как было предложено), чтобы скрыть курсор временно.

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

  • после скрытия курсора и изменение экрана до снова показывает курсор движение он возвращается к исходному местоположению.
  • скрытие / отображение курсора только удерживает курсор от заметного мигания при обновлении это займет совсем немного времени. Если вам случилось смешать это с каким-то трудоемким процессом, ваш курсор будет Блинк.

предлагаемое решение с использованием setterm не является портативным; он специфичен для консоли Linux. И запуск исполняемого файла с помощью system на самом деле не нужно. Но даже

system("tput civis");
...
system("tput cnorm");

улучшение по сравнению с использованием setterm.

проверка исходного кода на wget не находит скрытия курсора escape-последовательность. То, что вы видите с его индикатором прогресса,-это то, что он оставляет курсор примерно в том же месте, когда он делает что-то трудоемкое. Вывод на терминал занимает так мало времени, что вы не замечаете мгновенной перезаписи строки (путем печати возврата каретки, а затем записи большей части строки снова). Если бы это было медленнее, то скрытие курсора помогло бы-до точки.

кстати - этот метод скрытия курсора используется в терминале драйверы для некоторых редакторов (Vim и мерзкие).


нажать клавишу Insert...если это не работает, нажмите fn клавишу на клавиатуре. Это, безусловно, работать
Надеюсь, это поможет


почему курсор прыгает вокруг, потому что stdout буферизуется, поэтому вы не знаете, сколько символов печатается в какой-то момент времени. Причина wget не имеет прыгающего курсора - это то, что они фактически печатают на . Попробуйте следующее:

fprintf(stderr,"\r[%6.4f%%]",percent);

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

$ ./executable > log.data