三总输入模式比较
int GetInputEvent(PT_InputEvent ptInputEvent)
{
/* 把链表中的InputOpr的GetInputEvent都调用一次,一旦有数据即返回 */
PT_InputOpr ptTmp = g_ptInputOprHead;
while (ptTmp)
{
if (0 == ptTmp->GetInputEvent(ptInputEvent))
{
return 0;
}
ptTmp = ptTmp->ptNext;
}
return -1;
}
int GetInputEvent(PT_InputEvent ptInputEvent)
{
/* 用select函数监测stdin,touchscreen,
有数据时再调用它们的GetInputEvent或获得具体事件
*/
PT_InputOpr ptTmp = g_ptInputOprHead;
fd_set tRFds;
int iRet;
tRFds = g_tRFds;
iRet = select(g_iMaxFd, &tRFds, NULL, NULL, NULL);
if (iRet > 0)
{
while (ptTmp)
{
if (FD_ISSET(ptTmp->iFd, &tRFds))
{
if(0 == ptTmp->GetInputEvent(ptInputEvent))
{
return 0;
}
}
ptTmp = ptTmp->ptNext;
}
}
return -1;
}
static void *InputEventTreadFunction(void *pVoid)
{
T_InputEvent tInputEvent;
/* 定义函数指针 */
int (*GetInputEvent)(PT_InputEvent ptInputEvent);
GetInputEvent = (int (*)(PT_InputEvent))pVoid;
while (1)
{
if(0 == GetInputEvent(&tInputEvent))
{
/* 唤醒主线程, 把tInputEvent的值赋给一个全局变量 */
/* 访问临界资源前,先获得互斥量 */
pthread_mutex_lock(&g_tMutex);
g_tInputEvent = tInputEvent;
/* 唤醒主线程 */
pthread_cond_signal(&g_tConVar);
/* 释放互斥量 */
pthread_mutex_unlock(&g_tMutex);
}
}
return NULL;
}
int GetInputEvent(PT_InputEvent ptInputEvent)
{
/* 休眠 */
pthread_mutex_lock(&g_tMutex);
pthread_cond_wait(&g_tConVar, &g_tMutex);
/* 被唤醒后,返回数据 */
*ptInputEvent = g_tInputEvent;
pthread_mutex_unlock(&g_tMutex);
return 0;
}
总结
1.while(1)循环,cpu占用率高,不知得推荐
2.select由于内核不会一直占用cpu可见,会自己调度一次,不会一直占用cpu,占用得到下降,但适合少量文件描述符
如何实现:清除描述符集合,设置描述符,select传送到内核。通过返回值和FD_ISSET(描述符测试)获得对应事件。select底层如何实现。(??)
3.多线程模式,多路寻找,不会一直占用cpu,可适合多个文件描述符的使用,同时多线程内部共享同一进程数据,因此通过互斥量来使同一时间内只有一个线程调用此变量。
如何实现,获取输入事件的主线程获取互斥量,阻塞等待子线程唤醒,主线程再释放互斥量。子线程通过获取互斥量,获取输入事件后传送给主线程,通过条件变量唤醒主线程,再释放互斥量。
使用多线程优化多输入事件,使得cpu占用率从98%降到2%