C语言 在设置timeout()的情况下使用getch()时重新绘制延迟



我有一个护士程序,我需要即时响应用户输入和术语调整大小和重绘之间的1秒延迟。

  • 通过使用sleep(1),我在启动和术语大小调整时立即重新绘制,但在用户输入时延迟1秒。
  • 通过使用timeout(1 * 1000)getch(),我得到输入的即时响应,但在启动和调整大小时重绘延迟1秒。

下面是演示这个问题的示例程序:

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <ncurses.h>
static sig_atomic_t resize;
void sighandler(int sig) {
    if (sig == SIGWINCH)
        resize = 1;
}
int main(int argc, char *argv[]) {
    double delay = 1.0;
    char key = ERR;
    WINDOW *testwin;
    if (argc > 1)
        delay = strtod(argv[1], NULL);
    signal(SIGWINCH, sighandler);
    initscr();
    timeout(delay * 1000);
    testwin = newwin(LINES, COLS, 0, 0);
    while (key != 'q') {
        if (key != ERR)
            resize = 1;
        if (resize) {
            endwin();
            refresh();
            clear();
            werase(testwin);
            wresize(testwin, LINES, COLS);
            resize = 0;
        }
        box(testwin, 0, 0);
        wnoutrefresh(testwin);
        doupdate();
        key = getch();
    }
    delwin(testwin);
    endwin();
    return EXIT_SUCCESS;
}

我正在考虑select和/或线程:一个线程可以监视调整大小,而另一个线程将等待用户输入。

你可以用select同步线程,它可以等待多个文件描述符:例如,当你检测到一个事件唤醒主进程时,你可以在管道上写。很酷的是,即使没有事件发生,你也可以设置一个被唤醒的超时时间(然后你可以设置一个一秒的超时时间来触发重绘)。

我设法通过删除clear();来解决调整大小延迟

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <ncurses.h>
static sig_atomic_t resize;
void sighandler(int sig) {
    if (sig == SIGWINCH)
        resize = 1;
}
int main(int argc, char *argv[]) {
    double delay = 1.0;
    char key = ERR;
    WINDOW *testwin;
    if (argc > 1)
        delay = strtod(argv[1], NULL);
    signal(SIGWINCH, sighandler);
    initscr();
    timeout(delay * 1000);
    testwin = newwin(LINES, COLS, 0, 0);
    while (key != 'q') {
        key = getch();
        if (key != ERR)
            resize = 1;
        if (resize) {
            endwin();
            refresh();
            werase(testwin);
            wresize(testwin, LINES, COLS);
            resize = 0;
        }
        box(testwin, 0, 0);
        wnoutrefresh(testwin);
        doupdate();
    }
    delwin(testwin);
    endwin();
    return EXIT_SUCCESS;
}

相关内容

  • 没有找到相关文章

最新更新