多執行緒支援多輸入

2021-10-08 18:15:57 字數 3204 閱讀 3005

main.c

|input_manager.c

||touchscreen.c stdin.c

輸入模組分為三層,input_manager.c通過鍊錶管理底層各種輸入裝置,每個裝置向上註冊inputopr結構體,提供該裝置的各種操作函式和資料。

其中input_manager.c實現了幾個函式供main.c呼叫。

//呼叫所有"輸入模組"的裝置相關的初始化函式並建立用於讀取輸入資料的子執行緒

intallinputdevicesinit

(void);

//獲得輸入資料,它會使得當前執行緒休眠,當各輸入模組的子執行緒讀到資料後會把它

//喚醒(與touchscreen.c等提供的getinputevent函式不同)供下層呼叫

intgetinputevent

(pt_inputevent ptinputevent)

;//註冊"輸入模組"呼叫下層

intregisterinputopr

(pt_inputopr ptinputopr)

;//呼叫各個輸入模組的初始化函式,就是註冊各個輸入模組

intinputinit

(void

);

輸入操作

typedef

struct inputopr t_inputopr,

*pt_inputopr;

輸入事件結構體

typedef

struct inputevent t_inputevent,

*pt_inputevent;

main.c呼叫input_manager.c的getinputevent函式獲取輸入事件進入休眠,allinputdevicesinit函式中初始化各個輸入裝置,並建立子執行緒,其中執行緒函式傳遞的引數就是該裝置的getinputevent函式,各個裝置都迴圈呼叫read函式並以阻塞方式開啟,所以都會進入休眠,當獲得輸入事件後,子執行緒喚醒主線程

參考 unix_linux_windows_openmp多執行緒程式設計.pdf p18 3.3.2 條件變數

前面兩種方式都是單執行緒實現的,第一種輪詢方式while死迴圈,不斷呼叫getinputevent函式,cpu佔用率高。第二種也會呼叫getinputevent函式,執行到select會休眠,由核心喚醒,不斷迴圈。第三種多執行緒,主線程休眠,子執行緒也在休眠,一旦有資料就喚醒子執行緒,子執行緒得到資料再來喚醒主線程,傳遞輸入事件結構體inputevent,注意使用互斥鎖保護臨界資源(全域性變數)。

互斥鎖和條件變數

main函式

ierror =

allinputdevicesinit()

;//呼叫所有輸入裝置初始化

while(1

)else

if(tinputevent.ival == input_value_up)

else

if(tinputevent.ival == input_value_exit)

}}

input_manager.c函式

static t_inputevent g_tinputevent;

//全域性變數,臨界資源

static pthread_mutex_t g_tmutex = pthread_mutex_initializer;

//互斥量

static pthread_cond_t g_tconvar = pthread_cond_initializer;

//條件變數

static

void

*inputeventtreadfunction

(void

*pvoid)

}return

null;}

intallinputdevicesinit

(void

) pttmp = pttmp->ptnext;

}return ierror;

}int

getinputevent

(pt_inputevent ptinputevent)

main函式先呼叫allinputdevicesinit()函式,呼叫各輸入裝置的初始化函式,還會建立子執行緒。子執行緒的inputeventtreadfunction函式根據傳入引數不同,呼叫touchscreen或stdin的getinputevent(&tinputevent)函式來獲得輸入事件。

main函式中,迴圈呼叫input_manager.c的getinputevent函式來獲得輸入事件,獲得互斥量,等待條件變數pthread_cond_wait休眠。

若touchscreen或stdin中獲得輸入事件,獲得互斥量,把值賦給全域性變數g_tinputevent,喚醒主線程pthread_cond_signal。

input_manager.c的getinputevent函式被喚醒後,此時全域性變數g_tinputevent的值為touchscreen或stdin傳來的輸入事件,將該值返回給main函式,釋放互斥量。

stdin.c函式

static

intstdingetinputevent

(pt_inputevent ptinputevent)

touchscreen.c函式

static

inttouchscreengetinputevent

(pt_inputevent ptinputevent)

if(tsamp.pressure <=0)

else

else

if(idelta <

0- gixres/5)

else

return0;

}}}else

}return0;

}

其中

觸控螢幕read得到的資料,參考ts_print和tslib.h

struct ts_sample

;

多輸入之輪詢

目錄 倉庫 方式一方式二 這裡我們採用兩種方式的輸入,使用查詢的方式來讀取具體的輸入,輪詢的前提就是所有輸入裝置都是非阻塞的 關於這裡的io模型,select參考 嵌入式linux應用程式開發標準教程 裡面的第六章 對於觸控螢幕的庫tslib,支援非阻塞開啟,也就是傳遞引數1即可 struct ts...

C 支援多執行緒

c 支援多執行緒並行執行程式 1.乙個程式由乙個單執行緒開始,該單執行緒由clr和作業系統建立而成,並具有多執行緒建立額外執行緒的功能.2.建立執行緒的方法 2.1通過thread類來建立執行緒.threadstart委託建立執行緒 threadstart ts new threadstart ru...

keras搬磚系列 keras多輸入多輸出模型

使用函式式模型的乙個典型的場景就是搭建多輸入,多輸出模型。考慮這樣乙個模型,希望 一條新聞會被 和點讚多少次。模型的主要輸入是新聞的本身,也就是乙個詞語的序列,但是我們可能還需要額外的輸入,新聞發布的日期等,所以這個模型的損失函式將會由兩個部分組成,輔助的損失函式基於新聞本身做出的 的情況,主損失函...