如何解锁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

这两个(wtimeoutnodelay)都设置在给定的窗口上,并且可以根据需要进行修改。 不同窗口上的wgetch 不受影响。

例如,要对game_win 使用非阻塞读取,您可以在keypad 调用附近添加:

nodelay(game_win, TRUE);

【讨论】:

怎么办?对不起,我是新来的xD

以上是关于如何解锁wgetch?的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 如何查询被锁定表及如何解锁释放session

ORACLE 如何查询被锁定表及如何解锁释放session

小米笔记本与小米手环2如何连接解锁

java 如何做系统锁定,解锁后回到锁定前的页面?

笔记本电脑如何解锁

如何使用 C# 解锁用户 PC [重复]