输入管理学习笔记

来源:互联网 发布:淘宝企业店铺好不好 编辑:程序博客网 时间:2024/05/22 01:35
#include <config.h>#include <input_manager.h>#include <string.h>static PT_InputOpr g_ptInputOprHead;static T_InputEvent g_tInputEvent;static pthread_mutex_t g_tMutex  = PTHREAD_MUTEX_INITIALIZER;static pthread_cond_t  g_tConVar = PTHREAD_COND_INITIALIZER;int RegisterInputOpr(PT_InputOpr ptInputOpr)//加入链表 {PT_InputOpr ptTmp;if (!g_ptInputOprHead){g_ptInputOprHead   = ptInputOpr;ptInputOpr->ptNext = NULL;}else{ptTmp = g_ptInputOprHead;while (ptTmp->ptNext){ptTmp = ptTmp->ptNext;}ptTmp->ptNext  = ptInputOpr;ptInputOpr->ptNext = NULL;}return 0;}void ShowInputOpr(void){int i = 0;PT_InputOpr ptTmp = g_ptInputOprHead;while (ptTmp){printf("%02d %s\n", i++, ptTmp->name);ptTmp = ptTmp->ptNext;}}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 AllInputDevicesInit(void){PT_InputOpr ptTmp = g_ptInputOprHead;int iError = -1;while (ptTmp){if (0 == ptTmp->DeviceInit()){/* 创建子线程 */pthread_create(&ptTmp->tTreadID, NULL, InputEventTreadFunction, ptTmp->GetInputEvent);iError = 0;}ptTmp = ptTmp->ptNext;}return iError;}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;}int InputInit(void){int iError;iError = StdinInit();//初始化标准化输入输出 iError |= TouchScreenInit();//初始化触摸屏 return iError;}