Вопрос по c++, cursor, shell, terminal – удаление мигания курсора в терминале, как?

7

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

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   ответов
0

менно скрыть курсор.

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

after hiding the cursor and modifying the screen, before showing the cursor again move it back to the original location. hiding/showing the cursor only keeps the cursor from noticeably blinking when your updates take only a small amount of time. If you happened to mix this with some time-consuming process, your cursor will blink.

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

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

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

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

Кстати & # x2014; эта техника сокрытия курсора используется в драйверах терминала для некоторых редакторов (vim иподлый).

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

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

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

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

$ ./executable > log.data
17

DECTCEM (Режим включения текстового курсора DEC) вDECSM а такжеDECRM:

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

fputs("\e[?25h", stdout); /* show the cursor */
Спасибо. Это работает для меня.
Везде, где они требуются. Обычно вы скрываете курсор перед любыми обновлениями, выполняете все обновления и затем показываете его снова в конце. Вы даже можете объединить их все в одномprintf если ты хочешь.
Вы имеете в виду в цикле, после этой командыprintf("\r[%6.4f%%]",percent);? Daniel
0

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

12

попробуйте использовать правильное количество символов \ apos; \ b & apos; (backspace) символы вместо "\ r".

== РЕДАКТИРОВАТЬ ==

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

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

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

К сожалению, безуспешно :( Daniel
К сожалению, после выключения он не может быть снова включен Daniel
Ой, я люблю цифры :) Хорошо, я попробую # и сообщу результаты, но в любом случае, просто Google, кто-то сказал, что wget не использует ncurses Daniel
Отлично! Это работает Daniel
Зачем тебе проц? Вы можете просто написать «#». персонажи, один за другим. Например, один '#'; за каждые новые 10% с.
0

Ncurses, Увидетьmvaddstr

wget и fbi являются двумя примерами программ, которые не используют ncurses, но способны полностью скрыть курсор.

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