5.3多线程条件变量
生活随笔
收集整理的這篇文章主要介紹了
5.3多线程条件变量
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
多線程條件變量應用例子
?
?
Input_manager.h
InputOpr 結構體添加
?
進程 ID :pthread_t t_TreadID;
?
int AllInputDevicesInit(void) {PT_InputOpr ptTmp = g_ptInputOprHead;int iError = -1;while (ptTmp){if (0 == ptTmp->DeviceInit()){/* 創(chuàng)建子線程 */pthread_create(&ptTmp->t_TreadID, NULL,InputEventThreadFunction, ptTmp->GetInputEvent);/* 最后一個參數(shù)是給 InputEventThreadFunction用的*/iError = 0;}ptTmp = ptTmp->ptNext;}return iError; }?
/* 線程函數(shù) */ static void* InputEventThreadFunction(void *pVoid) {T_InputEvent tInputEvent;/* 定義函數(shù)指針 */int (*GetInputEvent)(PT_InputEvent ptInputEvent);/* 讓這個函數(shù)指針指向 輸入參數(shù)*/GetInputEvent = (int (*)(PT_InputEvent))pVoid;while(1){if(0 == GetInputEvent(&tInputEvent)){/* 有數(shù)據變化,喚醒主進程,把tInputEvent的值傳給一個全局變量 *//* 訪問臨界資源前先獲得互斥變量 */pthread_mutex_lock(&g_tmutex);/* 原子方法賦值 */g_tInputEvent = tInputEvent;/* 喚醒主線程 */pthread_cond_signal(&g_tcondvar);/* 釋放互斥變量 */pthread_mutex_unlock(&g_tmutex);}}return NULL;}?
int GetInputEvent(PT_InputEvent ptInputEvent) {/* 休眠 */pthread_mutex_lock(&g_tmutex);/* 條件等待函數(shù) */pthread_cond_wait(&g_tcondvar, &g_tmutex);/* 程序能夠向下繼續(xù)證明被喚醒啦 *//* 被喚醒之后返回數(shù)據 */*ptInputEvent = g_tInputEvent;pthread_mutex_unlock(&g_tmutex);return 0; }?
Makefile 添加線程庫 –lpthread
LDFLAGS := -lm -lfreetype -lts –lpthread
?
g_tTSDev = ts_open(pcTSName, 0);? /* 以阻塞方式打開 */
其實就是兩個輸入方式都以循環(huán)方式等待有數(shù)據變化,然后喚醒主線程處理
?
改為滑動翻頁
只需修改一個函數(shù)即可
?
static int TouchScreenGetInputEvent(PT_InputEvent ptInputEvent) {struct ts_sample tSamp;struct ts_sample tSampPressed;struct ts_sample tSampReleased;int iRet;int bStart = 0;int iDelta;static struct timeval tPreTime;while(1){iRet = ts_read(g_tTSDev, &tSamp, 1); /* 如果無數(shù)據則休眠 */if(1 == iRet){if ((tSamp.pressure > 0) && (bStart == 0)){tSampPressed = tSamp;bStart = 1;}if (tSamp.pressure <= 0){tSampReleased = tSamp;//bStart = 0;/* 處理數(shù)據 */if(!bStart){return -1;}else{iDelta = tSampReleased.x - tSampPressed.x;ptInputEvent->tTime = tSampReleased.tv;ptInputEvent->iType = INPUT_TYPE_TOUCHSCREEN;if (iDelta > giXres/5){/* 翻到上一頁 */ ptInputEvent->iVal = INPUT_VALUE_UP;}else if (iDelta < 0 - giXres/5){/* 翻到下一頁 */ptInputEvent->iVal = INPUT_VALUE_DOWN;}else{ptInputEvent->iVal = INPUT_VALUE_UNKNOWN;}return 0;}} }else{return -1;}}return 0; }轉載于:https://www.cnblogs.com/CZM-/p/5367565.html
總結
以上是生活随笔為你收集整理的5.3多线程条件变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2008+Windows DDK 7
- 下一篇: 讨喜的隔离可变性(五)同时使用多个角色