如何解锁wgetch?

我有一个学校作业,我将基于客户端 – 服务器架构实现一个游戏.
服务器端控制所有游戏,客户端只有一张正在发生的事情的图像.
服务器的一个功能是从游戏中踢出客户端,这就是问题所在.

我在客户端有一个线程接收来自服务器的消息,主线程接收来自用户的输入,但是当第一个线程收到shutdown命令时,主线程在执行关闭之前等待来自客户端的一个密钥.

我的问题是:有没有办法解除主线程上的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);
            wattron(info_win,A_REVERSE | A_BOLD);
            mvwprintw(info_win,2,4,"Score");
            mvwprintw(info_win,5," %d ",resp.points);
            mvwprintw(info_win,6,"Bombinhas");
            mvwprintw(info_win,8,resp.bombinha);
            mvwprintw(info_win,10,"Megabombas");
            mvwprintw(info_win,12,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,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表示服务器正在踢出播放器/客户端.
抱歉英文不好:)

解决方法

在诅咒中,你有三个选择

>阻止读取没有时间限制(这是你现在正在做的)
>使用wtimeout阻止具有时间限制的读取
>非阻塞读取,使用nodelay

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

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

nodelay(game_win,TRUE);

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...