最近实现了Qt的自定义键盘,虽然可以使用,但是CPU占用总是很高,将近100%。
调查可以发现Qt的键盘事件监控是通过QSocketNotifier实现的。
m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
connect (m_notifier, SIGNAL(activated(int)), this, SLOT(remoteDataIncoming()));
问题就出在这里,说明驱动一直可以读取,导致一直调用Read函数。而QSocketNotifier的activated(int)信号是根据驱动poll函数返回的状态触发的,自己的驱动未加入该函数。
解决方法如下:
在驱动中加入poll函数,按键按下的时候才将mask设置为mask |= POLLIN | POLLRDNORM;
<SPAN>unsigned int s3c_key_poll (struct file *filp, struct poll_table_struct *wait)
{
unsigned int mask = 0;
if(readl(GPLDAT))
{
mask |= POLLIN | POLLRDNORM; /* 表示数据可获取 */
}
return mask;
}</SPAN>
其实驱动我不熟悉,遇到了才去解决,当然驱动的阻塞和非阻塞还不太懂,在这里简记一下,方便以后整理。
哎,总是觉得自己知道的太少了。
//~End~