5.3多線程條件變數

来源:http://www.cnblogs.com/CZM-/archive/2016/04/08/5367565.html
-Advertisement-
Play Games

多線程條件變數應用例子 Input_manager.h InputOpr 結構體添加 進程 ID :pthread_t t_TreadID; Makefile 添加線程庫 –lpthread LDFLAGS := -lm -lfreetype -lts –lpthread g_tTSDev = ts ...


 

多線程條件變數應用例子

1

2

3

 

4

 

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())
        {
            /* 創建子線程 */
            pthread_create(&ptTmp->t_TreadID, NULL,
            InputEventThreadFunction, ptTmp->GetInputEvent);
            /* 最後一個參數是給 InputEventThreadFunction用的*/
            
            iError = 0;
        }
        ptTmp = ptTmp->ptNext;
    }
    return iError;
}

 

/* 線程函數 */
static void* InputEventThreadFunction(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_tcondvar);

            /* 釋放互斥變數 */
            pthread_mutex_unlock(&g_tmutex);
            
        }
    }

    return NULL;
    
}

 

int GetInputEvent(PT_InputEvent ptInputEvent)
{
    /* 休眠 */
    pthread_mutex_lock(&g_tmutex);
    
    /* 條件等待函數 */
    pthread_cond_wait(&g_tcondvar, &g_tmutex);
    
    /* 程式能夠向下繼續證明被喚醒啦 */
    /* 被喚醒之後返回數據 */
    *ptInputEvent = g_tInputEvent;
    pthread_mutex_unlock(&g_tmutex);

    return 0;    
}

 

Makefile 添加線程庫 –lpthread

LDFLAGS := -lm -lfreetype -lts –lpthread

 

g_tTSDev = ts_open(pcTSName, 0);  /* 以阻塞方式打開 */

其實就是兩個輸入方式都以迴圈方式等待有數據變化,然後喚醒主線程處理

 

改為滑動翻頁

只需修改一個函數即可

 

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); /* 如果無數據則休眠 */

        if(1 == iRet)
        {
            if ((tSamp.pressure > 0) && (bStart == 0))
                {
                    tSampPressed = tSamp;
                    bStart = 1;
                }
            
            if (tSamp.pressure <= 0)
            {
                tSampReleased = tSamp;
                //bStart = 0;
                /* 處理數據 */
                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;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 逆天最近在弄一個本地和伺服器自動同步的東西,每天都會添加很多新數據,本地和伺服器同樣的ShopMenu表,我總不能每次都把伺服器的清掉然後再把本地的導入進去吧~ 可能有人說~直接插伺服器的資料庫不就可以了嗎? 可惜==》 本地的數據測試通過後才允許同步到伺服器中 可能又有人說~設置一個 所以就有了以 ...
  • 下麵的是MySQL安裝的圖解,用的可執行文件:下載地址:http://www.jinhusns.com/Products/Download/?type=xcj相關下載 mysql安裝嚮導啟動,按“Next”繼續 選擇安裝類型,有“Typical(預設)”、“Complete(完全)”、“Custom ...
  • 環境:centos7+oracle 11gr2 公網:固定IP 癥狀:1521埠正常,netmanager配置測試正常,plsql連接提示ORA-12514: TNS:listener does not currently know of service requested in connect ... ...
  • 編寫mongo查詢語句到 find.js 然後mongo ip/dbname find.js > result.txt 採用標準輸出的形式重定向到文件 result.txt 中 上面用到了 正則匹配,採用 /.*關鍵詞.* /的形式進行模糊查詢 ...
  • 在測試ORACLE 10.2.0.4升級到10.2.0.5 Patch Set的過程中,遇到一個內核參數檢查失敗的問題,具體錯誤信息如下所示 實驗環境: 操作系統:Oracle Linux Server release 5.7 記憶體:4G 資料庫版本:10.2.0.4.0 Checking oper... ...
  • 1、下載安裝redis 在linux伺服器上,命令行執行以下命令(cd ./usr local/src 一般源碼放在這裡(推薦源碼安裝)) 說明: wget:下載遠程文件到本地當前文件夾中。 tar xzf :解壓文件到當前文件夾目錄 cd:進入文件夾 make make all make inst ...
  • 距離上次折騰已經有很長一段時間了。。。 不說這個,剛好有空閑,把這兩天折騰的 Tomcat 8 的服務配置整理出來收錄一下。 1、JDK安裝 1)檢查伺服器是否預裝了 openJdk,如果有就刪除,在這裡因為我的系統里沒有所以不多贅述。 2)到 oracle 的官網下載 JDK 安裝包,這裡我使用的 ...
  • 讓apache與mysql隨著系統自動啟動 在Linux中有一個文件/etc/rc.d/rc.local文件,其系統在啟動時會自動載入該文件,我們可以把要啟動的服務放入這個文件中即可。 添加以下代碼: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...