多執行緒實現電子相框輸入

2021-10-01 16:31:21 字數 1678 閱讀 1409

多執行緒輸入基本框架

初始化時,建立子執行緒;主線程呼叫休眠函式進入休眠狀態,等待被子執行緒喚醒;子執行緒中,分別呼叫各個裝置的事件函式,隨即各個子執行緒進入休眠狀態;當輸入事件發生的時候,喚醒子執行緒,子執行緒喚醒主線程;在主線程中對事件進行處理。

在原先實現查詢方式的工程中修改:

input_manager.c中:

裝置應用程式中:

int

pthread_create

(pthread_t *restrict tidp,

const pthread_attr_t *restrict_attr,

void*(

*start_rtn)

(void*)

,void

*restrict arg)

;

第乙個引數為指向執行緒識別符號的指標。

第二個引數用來設定執行緒屬性。如果設定為null則按照預設設定。

第三個引數是執行緒執行函式的位址。執行緒從這個函式開始執行。void*(*start_rtn)(void*)這種寫法表示start_rtn為乙個函式指標,該指標指向的函式返回的是乙個void型的指標。

最後乙個引數是執行緒執行函式的引數。可以設定成乙個函式指標,不過在呼叫函式指標的時候必須要進過強制型別轉換,將指標轉化成目標呼叫函式型別。在此最後乙個引數傳入了事件處理函式的指標。

pthread_create

(&pttemp->tinfo,

null

,startroutine,pttemp->inputdeveventidel)

;/*建立乙個子執行緒,並跳轉到startroutine執行*/

這個函式在初始化函式中實現,每對乙個裝置進行初始化,就建立乙個執行緒。

ldflags := -lm -lfreetype -lts -lpthread
以上程式涉及到多執行緒之間通訊,常見的通訊方式如互斥鎖、條件變數、訊號、讀寫鎖等。

在此採用的主要是條件變數。在此參考了深入解析條件變數。

int

getinputevent

(pt_inputeventopr ptinputevent)

/*事件處理,或者叫事件查詢*/

pthread_cond_wait執行過程中,首先將執行緒放置在等待佇列當中,同時施放互斥鎖,以方便其他執行緒(或者叫生產者執行緒\子執行緒)對條件變數進行修改。但是要注意的是,執行到此函式的時候執行緒會發生pending;當生產者執行緒發出訊號之後,pthread_cond_wait解除擁塞,獲取互斥鎖,對生產者產生的資料進行處理。

void

*startroutine

(void

*pvtemp)

}return

null

;}

關於為什麼需要將條件變數與互斥鎖一起使用:條件變數g_condvar屬於全域性變數,要對它進行修改本身就需要加鎖;消費者執行緒進入pending的時候,pthread_cond_wait會把鎖釋放,以使得條件變數可修改,生產者執行緒如果想要呼叫pthread_cond_signal發出訊號,首先如要獲取鎖,這樣盡可能的防止了訊號丟失的情況。

多執行緒支援多輸入

main.c input manager.c touchscreen.c stdin.c 輸入模組分為三層,input manager.c通過鍊錶管理底層各種輸入裝置,每個裝置向上註冊inputopr結構體,提供該裝置的各種操作函式和資料。其中input manager.c實現了幾個函式供main....

(40)多執行緒 實現多執行緒方法

建立執行緒用法 1.繼承thread,重寫run 方法,建立子類物件 a a new a 執行緒開始執行 a.start 2.實現runnable介面,實現run 方法,建立實現類物件 a a new a 建立 類物件 thread t new thread a 執行緒開始執行 t.start 上面...

執行緒基礎 實現多執行緒

public class thread01 extends thread public static void main string args public class thread02 implements runnable public static void main string args...