5.2使用select,poll

 

5.2 使用select,poll   // CPU占用率低,适用于很多简单场合

参考:UNIX环境高级编程 I/O多路转接

监测多个文件,只要有某一个文件可读/可写/异常或超时,即返回
int select(int nfds,    fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
                最大文件句柄+1   被监测是否可读的文件                                         超时时间
                                               被监测是否可写的文件
                                                                被监测是否有异常的文件
   

修改

int AllInputDevicesInit(void)
{
    PT_InputOpr ptTmp = g_ptInputOprHead;
    int iError = -1;

    FD_ZERO(&g_tRFds);

    while (ptTmp)
    {
        if (0 == ptTmp->DeviceInit())
        {
            FD_SET(ptTmp->iFd, &g_tRFds);
            if (g_iMaxFd < ptTmp->iFd)
                g_iMaxFd = ptTmp->iFd;
            iError = 0;
        }
        ptTmp = ptTmp->ptNext;
    }

    g_iMaxFd++;
    return iError;
}

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;
}
posted @ 2016-04-03 15:26  CAM&  阅读(323)  评论(0编辑  收藏  举报