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