Обновление NCurses

У меня есть небольшая программа ncurse, которую я запускаю, но вывод, похоже, не появляется, если я не вставлю wrefresh() в цикл while.

Есть ли какая-то буферизация или что-то еще? Я пробовал другие функции refresh в библиотеке и fflush с stddout (что, на мой взгляд, не имеет смысла, но стоит попробовать), но ничего не работает.

Второй маленький вопрос: чтобы сделать getch() неблокирование, нам нужно вызвать nodelay(win,TRUE), правильно?


void main()
{
        initscr();
        start_color();
        init_pair(1,COLOR_YELLOW,COLOR_CYAN);
        WINDOW *win = newwin(10,10,1,1);
        wbkgd(win,COLOR_PAIR(1));
        wprintw(win,"Hello, World.");
        wrefresh(win);
        getch();
        delwin(win);
        endwin();
}

Ответ 1

Вы не должны смешивать операции с stdscr и окна, созданные с помощью newwin(). getch() работает на stdscr, так что это ваша проблема. Замените этот вызов

wgetch(win);

(getch() вызывает сброс stdscr поверх другого вашего окна, и поскольку это происходит так быстро, похоже, что другое окно никогда не отображалось вообще).

Ответ 2

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