• 2937阅读
  • 3回复

[提问]如何高效的去监视键盘的按键事件? [复制链接]

上一主题 下一主题
离线tsuibin
 

只看楼主 倒序阅读 楼主  发表于: 2012-04-17
如何高效的去监视键盘的按键事件?


最近在做一个监视键盘按键事件的程序
其中有短代码是这样的


在一个线程
int fd = open(...);
static struct input_event data;
while(1)
{
   read(fd,&data,sizeof(data));
    .....do sth ...
  
}


这里的while(1)太占CPU资源了
但是这儿的read又不会进入到阻塞状态..
没有什么办法可以解决这个问题?
我尝试在read之前用select,但是select无法监视到键盘设备描述符可读……
求解
离线tsuibin

只看该作者 1楼 发表于: 2012-04-17
ps:
我在虚拟机里面测试了一下,没有这个问题


Ccazool@cazool-virtual-machine:~/code/source$ sudo ./a.out
code:4
code:28
code:0
acode:4
code:30
code:0
code:4
code:30


可以正常阻塞

虚拟机内核版本

inux cazool-virtual-machine 3.0.0-14-generic #23-Ubuntu SMP Mon Nov 21 20:28:43 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
离线tsuibin

只看该作者 2楼 发表于: 2012-04-17
测试代码:

#include <stdio.h>
#include <pthread.h>
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define EV_KBD "/dev/input/event1"

void * func(void * argv)
{
    static struct input_event ev_kbd;

    int fd = open(EV_KBD,O_RDONLY);

    while(1) {
        read(fd, &ev_kbd, sizeof(ev_kbd));
        printf("code:%d \n",ev_kbd.code);
    }

    return NULL;
}

int main()
{
    pthread_t pid;
    pthread_create(&pid, NULL, func, NULL);
    pthread_join(pid, NULL);

    return 0;    
}

离线zooood
只看该作者 3楼 发表于: 2012-04-17
mark一下
有没有不用轮询,而是类似于消息的“通知”机制呢
其实偶也不懂
快速回复
限100 字节
 
上一个 下一个