最近實現了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~