2.使用線程方式獲取標準輸入

来源:http://www.cnblogs.com/Lwd-linux/archive/2016/12/27/6225439.html
-Advertisement-
Play Games

前面講到,使用非阻塞方式有許多的缺點。主要是單線程,一直占用CPU資源,其他程式無法執行,造成資源的浪費。只能用於較簡單迴圈的場所。而線程靈活,CPU占用率小,適用於大部分場合。 1.條件變數的使用 條件變數是用來通知共用數據的狀態信息的機制。由於涉及共用數據,所以一般和互斥量配合使用。 1.1創建 ...


前面講到,使用非阻塞方式有許多的缺點。主要是單線程,一直占用CPU資源,其他程式無法執行,造成資源的浪費。只能用於較簡單迴圈的場所。而線程靈活,CPU占用率小,適用於大部分場合。

1.條件變數的使用

條件變數是用來通知共用數據的狀態信息的機制。由於涉及共用數據,所以一般和互斥量配合使用。

1.1創建和銷毀條件變數

pthread_cond_t表示條件變數。在使用pthread_cond_t變數前對其進行初始化。使用預設屬性,可以用PTHREAD_COND_INITIALIZER付給變數就可以完成初始化。

pthread_cond_desroy銷毀一個條件變數。函數形式為

1 pthread_cond_desroy(pthread_cond_t * cond)

1.2等待和通知條件變數

條件變數與條件測試是一起調用的。如果測試失敗,則調用pthread_cond_wait

int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex)

如果測試成功,則調用pthread_cond_signal函數。

1 int pthread_cond_signal(pthread_cond_t *cond)
pthread_cond_signal函數只喚醒一個阻塞在cond指向的條件變數上的線程。

2條件變數的應用

2.1 在AllInputDevicesInit函數內創建線程

1 if (0 == ptTmp->DeviceInit())
2 {
3     /* 創建子線程 */
4     pthread_create(&ptTmp->tTreadID, NULL, InputEventTreadFunction, ptTmp->GetInputEvent);            
5     iError = 0;
6 }
7 ptTmp = ptTmp->ptNext;

實現InputEventTreadFunction函數

 1 static void *InputEventTreadFunction(void *pVoid)
 2 {
 3     T_InputEvent tInputEvent;
 4     
 5     /* 定義函數指針 */
 6     int (*GetInputEvent)(PT_InputEvent ptInputEvent);
 7     GetInputEvent = (int (*)(PT_InputEvent))pVoid;
 8 
 9     while (1)
10     {
11         if(0 == GetInputEvent(&tInputEvent))
12         {
13             /* 喚醒主線程, 把tInputEvent的值賦給一個全局變數 */
14             /* 訪問臨界資源前,先獲得互斥量 */
15             pthread_mutex_lock(&g_tMutex);
16             g_tInputEvent = tInputEvent;
17 
18             /*  喚醒主線程 */
19             pthread_cond_signal(&g_tConVar);
20 
21             /* 釋放互斥量 */
22             pthread_mutex_unlock(&g_tMutex);
23         }
24     }
25 
26     return NULL;
27 }

2.2在Touchscreen.c里全改為阻塞方式

TouchScreenGetInputEvent函數修改如下:

 1 static int TouchScreenGetInputEvent(PT_InputEvent ptInputEvent)
 2 {
 3     struct ts_sample tSamp;
 4     struct ts_sample tSampPressed;
 5     struct ts_sample tSampReleased;
 6     int iRet;
 7     int bStart = 0;
 8     int iDelta;
 9 
10     static struct timeval tPreTime;
11     
12 
13     while (1)
14     {
15         iRet = ts_read(g_tTSDev, &tSamp, 1); /* 如果無數據則休眠 */
16         if (iRet == 1)
17         {
18             if ((tSamp.pressure > 0) && (bStart == 0))
19             {
20                 /* 剛按下 */
21                 /* 記錄剛開始壓下的點 */
22                 tSampPressed = tSamp;
23                 bStart = 1;
24             }
25             
26             if (tSamp.pressure <= 0)
27             {
28                 /* 鬆開 */
29                 tSampReleased = tSamp;
30 
31                 /* 處理數據 */
32                 if (!bStart)
33                 {
34                     return -1;
35                 }
36                 else
37                 {
38                     iDelta = tSampReleased.x - tSampPressed.x;
39                     ptInputEvent->tTime = tSampReleased.tv;
40                     ptInputEvent->iType = INPUT_TYPE_TOUCHSCREEN;
41                     
42                     if (iDelta > giXres/5)
43                     {
44                         /* 翻到上一頁 */
45                         ptInputEvent->iVal = INPUT_VALUE_UP;
46                     }
47                     else if (iDelta < 0 - giXres/5)
48                     {
49                         /* 翻到下一頁 */
50                         ptInputEvent->iVal = INPUT_VALUE_DOWN;
51                     }
52                     else
53                     {
54                         ptInputEvent->iVal = INPUT_VALUE_UNKNOWN;
55                     }
56                     return 0;
57                 }
58             }
59         }
60         else
61         {
62             return -1;
63         }
64     }
65 
66     return 0;
67 }

上述程式主要實現:觸摸點在x方向上的位移差值超過X解析度的1/5,就翻頁,從而實現滑動翻頁。

 


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

-Advertisement-
Play Games
更多相關文章
  • 最近使用SQL*Plus命令生成html文件,遇到一些有意思的知識點,順便記錄一下,方便以後需要的時候而這些知識點又忘記而捉急。好記性不如爛筆頭嗎! 為什麼要用SQL*Plus生成html文件? 有些人肯定會問,我使用SQL*Plus為什麼要生成html文件呢? SQL*Plus本身就是一個命令工具... ...
  • Redis緩存伺服器是一款key/value資料庫,讀110000次/s,寫81000次/s,因為是記憶體操作所以速度飛快,常見用法是存用戶token、簡訊驗證碼等 官網顯示Redis本身並沒有Windows版本的,微軟官方開發了基於Windows的Redis伺服器:MSOpenTech/redis ...
  • 觸發器在之前的項目中, 應用的著實不多, 沒有辦法的時候, 才會去用這個. 因為這個東西在後期並不怎麼好維護, 也容易造成紊亂. 我最近的項目中, 由於資料庫設計(別人設計的)原因, 導致一些最簡單功能, 查詢起來, 都很麻煩和複雜. 牽涉表非常多, 表與表之間又互有部分關係. 我想說, 這是我見過 ...
  • 比如有一個表,我們需要些一個語句像SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......' , 然後就能返回分割成單獨的行。 原表: | SomeID | OtherID | Data + + + | abcdef-..... | cdef1 ...
  • 第六節 Linux系統基礎優化 標簽(空格分隔):Linux實戰教學筆記 陳思齊 第1章 基礎環境 ![QQ20161227 [email protected] 60.5kB][1] 第2章 使用網易163鏡像做yum源 預設國外的yum源速度很慢,所以換成國內的。 第一步:先備份 mkdir backup ...
  • 我們在 "Linux設備管理(一)_kobject, kset,ktype分析" 一文中介紹了kobject的相關知識,在 "Linux設備管理(二)_從cdev_add說起" 和 "Linux設備管理(三)_匯流排設備的掛接" 舉例介紹了內核中是如何進行設備管理的,併在 "Linux設備管理(四)_ ...
  • 本人在官網下的是這個 CentOS-7-x86_64-DVD-1611.iso ,然後用UltraISO 9.6製作的U盤啟動盤,不過在安裝的時候出現了這個錯誤, 然後也是搜了好久,試了一下,下麵這個方法,是正確可行的.在最後我會解釋原因 第一步: 製作完成之後,將U盤的標簽名字改掉,隨便改成什麼, ...
  • linux許可權位 Linux文件或目錄的許可權位是由9個許可權位來控制,每三位為一組,它們分別是文件屬主許可權、屬組許可權、其他用戶許可權。 r:read可讀許可權,對應數字4; w:write可寫許可權,對應數字2; x:execute執行許可權,對應數字1; -:沒有任何許可權,對應數字0。 #創建一個用戶組 [... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...