如何解锁wgetch?
Posted
技术标签:
【中文标题】如何解锁wgetch?【英文标题】:How to unblock wgetch? 【发布时间】:2018-01-03 21:55:31 【问题描述】:我有一项学校作业,我将在其中实现一款基于客户端-服务器架构的游戏。 服务器端控制着所有的游戏,而客户端只有一个正在发生的事情的图像。 服务器的功能之一就是将客户端踢出游戏,问题就来了。
我在客户端有一个线程从服务器接收消息,主线程接收来自用户的输入,但是当第一个线程接收到关闭命令时,主线程在执行关闭之前等待来自客户端的一个键。
我的问题是:有什么方法可以解除对主线程 wgetch 的阻塞,使其不再等待键并执行关机?
代码:
void *trata_fifo(void *dados)
int i;
RESPONSE resp;
char namepipe[MAX];
sprintf(namepipe, CLIENT_FIFO, getpid());
mkfifo(namepipe, 0600);
fd_res = open(namepipe, O_RDWR);
do
i = read(fd_res, &resp, sizeof (RESPONSE));
drawGame(resp);
if (resp.command == 3)
wclear(info_win);
box(info_win, 0, 0);
wattron(info_win, A_REVERSE | A_BOLD);
mvwprintw(info_win, 2, 4, "Score");
mvwprintw(info_win, 4, 5, " %d ", resp.points);
mvwprintw(info_win, 6, 2, "Bombinhas");
mvwprintw(info_win, 8, 5, " %d ", resp.bombinha);
mvwprintw(info_win, 10, 2, "Megabombas");
mvwprintw(info_win, 12, 5, " %d ", resp.megaBomba);
wrefresh(info_win);
if (resp.command == 4) //here
SHUTDOWN = true;
write(STDIN_FILENO,NULL,0);//i tried this , but its not working
if (resp.command == 5)
SHUTDOWN = true;
while (!SHUTDOWN);
close(fd_res);
pthread_exit(NULL);
int main()
REQUEST client;
pthread_t tarefa;
int highlight = 1, choice = 0, opt;
int startx = 0, starty = 0;
signal(SIGINT, handleSignalCli);
signal(SIGUSR1, handleSignalCli);
signal(SIGALRM, handleSignalCli);
if (access(SERVER_FIFO, F_OK) != 0) //Verificar se servidor esta correndo
perror("[ERROR] Server ins't running...!/n");
exit(EXIT_FAILURE);
if (pthread_create(&tarefa, NULL, trata_fifo, NULL) != 0)
fprintf(stderr, "[ERROR] Creating Thread\n");
exit(EXIT_FAILURE);
fd = open(SERVER_FIFO, O_WRONLY);
if (!fd)
perror("[ERROR] Opening Server Fifo...!\n");
exit(EXIT_FAILURE);
/*...*/
while (!SHUTDOWN)
cbreak();
keypad(game_win, TRUE);
noecho();
client.command = 3;
client.tecla = wgetch(game_win);
res = write(fd, &client, sizeof (client));
close(fd);
pthread_join(tarefa, NULL);
delwin(game_win);
delwin(main_win);
endwin();
exit(0);
PS:resp.comand = 4 表示服务器正在踢出玩家/客户端。 抱歉英语不好:)
【问题讨论】:
【参考方案1】:在curses中,你有三个选择
没有时间限制的阻塞读取(这就是你现在正在做的) 有时间限制的阻塞读取,使用wtimeout
非阻塞读取,使用nodelay
这两个(wtimeout
和nodelay
)都设置在给定的窗口上,并且可以根据需要进行修改。 不同窗口上的wgetch
不受影响。
例如,要对game_win
使用非阻塞读取,您可以在keypad
调用附近添加:
nodelay(game_win, TRUE);
【讨论】:
怎么办?对不起,我是新来的xD以上是关于如何解锁wgetch?的主要内容,如果未能解决你的问题,请参考以下文章