注册 登录
编程论坛 C语言论坛

C语言多线程按键监听问题

cuihe500 发布于 2019-06-18 21:16, 2560 次点击
小弟想写一个贪吃蛇小游戏 需要用到按键监听 所以小弟想用多线程实现绘图和按键监听同时进行
但是按键监听占用CPU很高(35-45左右) 请各位大佬给小弟看一下怎么优化这个代码!万分感谢!

首先是函数代码:
程序代码:

void GetKB(void)
{
    char c;
    extern int Move;
    while (1)
    {
        if (_kbhit())
        {
            switch (_getch())
            {
            case up:
                Move = up;
                puts("up");
                break;
            case left:
                Move = left;
                puts("left");
                break;
            case right:
                Move = right;
                puts("right");
                break;
            case down:
                Move = down;
                puts("down");
                break;
            }
        }

    }
}

这里是主函数调用代码:
程序代码:

int main ()
{
    printf("贪吃蛇V0.1\n");
    DrawWall();
    NewGame();
    _beginthreadex(NULL, 0, (void*)GetKB, NULL, 0, NULL);
    Sleep(10000);
}
6 回复
#2
rjsp2019-06-19 09:59
先吐槽一下 (void*)GetKB,按MSDN说明,这个 GetKB 必须定义为 unsigned __stdcall GetKB( void* ),瞎搞。

如果你想降下 GetKB 的CPU占用率,那你可以在循环中加上 Sleep(1)

但是我不明白的是,既然你用独立的线程去接受键盘输入,那何必还要用 _kbhit()? 直接删掉它,也不要用Sleep(1)了。
#3
cuihe5002019-06-19 10:06
回复 2楼 rjsp
首先感谢大佬的回答 我自己又改了一下 把if(_kbhit())删去 直接用_getch()进行阻断式按键监测 把问题解决了
其次是线程我刚学习 感谢大佬提醒
新代码:
程序代码:

void func (void*a)
{
    char b;
    while(1)
    {

        puts("进程1开始运行");
        if(b=getch())
        {
            switch (b)
            {
                case up:
                    puts("up");
                    break;
                case down:
                    puts("down");
                    break;
                case left:
                    puts("left");
                    break;
                case right:
                    puts("right");
                    break;        
             }
        }
}

 }
#4
rjsp2019-06-19 10:13
回复 3楼 cuihe500
if(b=getch())
这是什么意思呀?
如果 getch 失败,它不是返回 0
     getch 成功时,也可能返回 0,比如按下 F1 键
#5
cuihe5002019-06-19 10:33
回复 4楼 rjsp
我不需要检测他的返回值 如果getch()接受到的不是wasd 那么就直接舍弃等待下一个值 或者加一个default:break; b=getch()是为了确定b获取了一个值 无论getch()获取得是什么都进行判断b 如果不正确直接舍去
#6
rjsp2019-06-19 10:51
回复 5楼 cuihe500
那我问简单些,你代码中“if(b=getch())”起什么作用? 写成 if(b=getch()) 与写成 b=getch(); 有什么区别?
#7
cuihe5002019-06-19 10:54
回复 6楼 rjsp
对哦 也应该是一样的
1