我有一个护士程序,我需要即时响应用户输入和术语调整大小和重绘之间的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;
}