5.2 使用select,poll // CPU占用率低,適用於很多簡單場合 參考:UNIX環境高級編程 I/O多路轉接 監測多個文件,只要有某一個文件可讀/可寫/異常或超時,即返回 int select(int nfds, fd_set *readfds, fd_set *writefds,fd_... ...
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; }