訊息機制(GUI執行緒講解)

2021-10-19 11:21:23 字數 2911 閱讀 1839

首先我們來畫乙個視窗:

}}什麼是視窗控制代碼?在**?有什麼用?

什麼是訊息?什麼是訊息佇列?訊息佇列在哪 ?

什麼是視窗過程?視窗過程是由誰呼叫的?沒有訊息迴圈視窗過程會執行嗎?

為什麼要有w32k.sys這個模組?

為什麼只有使用圖形介面的程式才可以訪問keservicedescriptortableshadow?

介面「卡死」的時候為什麼滑鼠還可以動?

首先我們假設把訊息佇列放在使用者空間(3環),那麼誰又來往使用者空間的訊息佇列儲存這些東西呢?

最好的解決方案就是找乙個專用程序來監聽滑鼠和鍵盤等,再來進行判斷是屬於哪個程序的訊息佇列,最後來進行訊息分發(linux解決方案)

弊端:涉及了跨程序通訊問題,專用程序傳給其它程序。大量時間都花在跨程序。

首先普及一下:

kernel32.dll----------> ntoskrnl.exe(程序,執行緒,記憶體管

user32.dll gdi32.dll -----------> win32k.sys(圖形介面,訊息管理)

windows已經畫好的介面(windows提供的)gui程式設計 user32.dll

不用windows提供的那些介面 gdi程式設計 gdi32.dll

視窗控制代碼hwn

針對視窗的控制代碼表,只有乙個,(放在核心中)表是全域性的,所有視窗共用的

hdc   hdc;

hpen hpen;

1.裝置物件 畫在哪

hwnd =(hwnd)0x0003543

;2.獲取裝置物件上下文

hdc=getdc(hwnd);

3.建立畫筆 設定線條屬性

hpen=

createpen

(ps_s0lid,5,

rgb(

0xff,00

,00))

;4.關聯

selectobject

(hdc,hpen)

;5.開始畫

lineto

(hdc,

400,

400)

;6.釋放資源

deleteobject

(hpen)

;releasedc

(hwnd,hdc)

;

它把訊息佇列放在(核心空間)0環中,

微軟的解決方案:gui執行緒

gui(自己使用微軟提供的視窗函式,比如createwindow,createbutton等建立的圖形介面,這種api就叫做gui)

gdi(如果覺得微軟提供的視窗不符合自己所需條件,需要自己畫,所用的那些api就叫gdi)

1.當執行緒剛建立的時候,都是普通執行緒:

thread.servicetable -->keservicedescriptortable(ssdt表)

servicetable中儲存了一張表,叫做系統服務表

2.當執行緒第一次呼叫(與圖形介面相關的模組 )win32k.sys時(只要試圖正常呼叫win32k中的任何乙個函式),會呼叫乙個函式:psconverttoguithread(把普通執行緒轉換為gui執行緒)

psconverttoguithread主要做幾件事:

a.擴充核心棧,必須換成64kb 的大核心棧,因為普通核心棧只有12kb大小。

b.建立乙個包含訊息佇列的結構體,並掛到kthread上(也就是kthread中的win32thread)

c.thread.servicetable–>keservicedescriptorshadow(ssdtshadow表)

d.把需要的記憶體資料對映到本程序空間

(ssdt表中只引用了一張表,只有一張系統服務表,也就是ntoskernel,win32k的第二張表它沒有。但是ssdtshaow表中既包含了ntoskernel中的函式,又包含了win32k(與圖形介面相關的)中的函式)

解釋:如果是乙個普通執行緒的話,那麼ethred結構體中成員kthread結構體中有乙個win32thread成員它是為空(未使用圖形介面相關的api)

如果是乙個gui執行緒的話,那麼ethred結構體中成員kthread有乙個win32thread成員它是乙個位址值,指向乙個結構體,指向乙個_threadinfo結構體,這個結構體裡面又有乙個成員,存放著訊息佇列

訊息佇列儲存在0環,通過kthread.win32thread可以找到

並不是所有執行緒都要訊息佇列,只有gui執行緒才有訊息佇列

乙個gui執行緒對應1個訊息佇列

Android 執行緒訊息迴圈機制

looper用於封裝了android執行緒中的訊息迴圈,預設情況下乙個執行緒是不存在訊息迴圈 message loop 的,需要呼叫looper.prepare 來給執行緒建立乙個訊息迴圈,呼叫looper.loop 來 使訊息迴圈起作用,從訊息佇列裡取訊息,處理訊息。注 寫在looper.loop...

訊息佇列講解

需要包含標頭檔案 include include include此外,其中msg一共提供四種操作函式,msgget,msgsnd,msgrcv,msgctl msgget是用來得到訊息佇列的識別符號或者建立訊息佇列 訊息佇列一旦建立除非顯示刪除或者重啟機器,否則將一直存在 在命令列下使用ipcs這個...

Jmeter非GUI介面 引數講解

學習內容 講解 非gui介面,壓測引數講解 h 幫助 n 非gui模式 t 指定要執行的 jmeter 測試指令碼檔案 l 記錄結果的檔案 每次執行之前,要確保之前沒有執行過,即 jtl不存在,不然報錯 r jmter.properties檔案中指定的所有遠端伺服器 e 在指令碼執行結束後生成htm...