标题:C语言多线程按键监听问题
只看楼主
cuihe500
Rank: 1
等 级:新手上路
帖 子:8
专家分:5
注 册:2019-4-25
结帖率:0
已结贴  问题点数:10 回复次数:6 
C语言多线程按键监听问题
小弟想写一个贪吃蛇小游戏 需要用到按键监听 所以小弟想用多线程实现绘图和按键监听同时进行
但是按键监听占用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);
}
搜索更多相关主题的帖子: 按键 监听 Move case puts 
2019-06-18 21:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
先吐槽一下 (void*)GetKB,按MSDN说明,这个 GetKB 必须定义为 unsigned __stdcall GetKB( void* ),瞎搞。

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

但是我不明白的是,既然你用独立的线程去接受键盘输入,那何必还要用 _kbhit()? 直接删掉它,也不要用Sleep(1)了。
2019-06-19 09:59
cuihe500
Rank: 1
等 级:新手上路
帖 子:8
专家分:5
注 册:2019-4-25
得分:0 
回复 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;        
             }
        }
}

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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-495347-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.225822 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved