qt win32
下的訊息派送機制 ——
qeventdispatcherwin32類
昨天為了準備接下來的比賽,做了乙個雙鏈表的快速排序,弄到了很晚,又一次沒有進行我的原始碼分析。今天又忙到現在才有一會屬於自己的時間去做原始碼分析。
今天主要的入手點是
qt底層的訊息傳遞機制,主要分析
windows
下的實現機制,這樣就需要對
qeventdispatcherwin32
類進行分析了
:class q_core_export qeventdispatcherwin32 : public qabstracteventdispatcher
;該類的定義很簡單,其中有一些非常熟悉的函式:
bool processevents(qeventloop::processeventsflags flags);
該函式是之前在
exec()
中看到的那個呼叫的實現部分。
void registersocketnotifier(qsocketnotifier *notifier);
void registertimer(int timerid, int interval, qobject *object);
bool registereventnotifier(qwineventnotifier *notifier);
接下來的三個函式應該分別是對網路事件、定時器事以及其他事件的通知訊號註冊。
我想,最熟悉的莫過於:
friend lresult callback qt_internal_proc(hwnd hwnd, uint message, wparam wp, lparam lp);
這個函式代表了已經是
win32api
函式,這樣針對底層的應用了。可見,
qt也是從該函式得到一些通知訊息的。我們接下來看下該類這些函式的實現。先看下最熟悉的那個**函式:
lresult callback qt_internal_proc(hwnd hwnd, uint message, wparam wp, lparam lp)
else if (message == wm_user)
if (type >= 0) ;
qsndict *dict = sn_vec[type];
qsocknot *sn = dict ? dict->value(wp) : 0;
if (sn) }}
return 0;
} else if (message == wm_timer)
long result;
return result;
qeventdispatcherwin32 *eventdispatcher =
qobject_cast(qabstracteventdispatcher::instance());
q_assert(eventdispatcher != 0);
qeventdispatcherwin32private *d = eventdispatcher->d_func();
d->sendtimerevent(wp);
return 0;
}returndefwindowproc(hwnd, message, wp, lp);
}這裡主要通過該部分將訊息傳遞到
qt應用程式中:
long result;
return result;
值得關注的是
getwindowlongptr
函式和setwindowlongptr
,在以前的程式編寫過程中,沒有用過。查了下,原來是用來儲存一些指標的,通過
setwindowlongptr(wnd, gwlp_userdata, (long_ptr)eventdispatcher);
方法進行設定,再呼叫
getwindowlongptr(hwnd, gwlp_userdata);
進行讀取,最後需要轉換為自己需要的指標型別即可。
當得到的是定時器訊息時,通過
d->sendtimerevent(wp);
方法將訊息傳送,最終呼叫
timerevent
方法。
最終是非常熟悉的
defwindowproc(hwnd, message, wp, lp);
方法。
在看完這個**函式之後,順便看到了建立視窗的函式:
static hwnd qt_create_internal_window(const qeventdispatcherwin32 *eventdispatcher)
該函式沒有什麼特別的地方。
另外乙個定義的靜態方法是:
void winapi callback qt_fast_timer_proc(uint timerid, uint /*reserved*/, dword_ptr user, dword_ptr /*reserved*/, dword_ptr /*reserved*/)
可以看到,該方法是用來對定時器訊息進行傳送的。
我們再看下
createinternalhwnd()
方法,該方法呼叫了
qt_create_internal_window
方法,這樣,建立了最底層的
win32
應用程式。
接下來看到了事件迴圈需要呼叫的一些函式:
// ### qt 5: remove
q_core_export bool winpeekmessage(msg* msg, hwnd hwnd, uint wmsgfiltermin,
uint wmsgfiltermax, uint wremovemsg)
// ### qt 5: remove
q_core_export bool winpostmessage(hwnd hwnd, uint msg, wparam wparam, lparam lparam)
// ### qt 5: remove
q_core_export bool wingetmessage(msg* msg, hwnd hwnd, uint wmsgfiltermin,
uint wmsgfiltermax)
但是好像
qt要在
5.0版本以後採用新的機制進行。
這裡其他的函式沒有什麼太多的意義了,接下來就是看下事件是怎麼迴圈起來的,或許
qeventloop
中會有些我們想要的東西。不過今天的時間已經不允許了,只能明天再來分析。
2023年10
月29日星期四23:
53
VC Win32 訊息的分類
二 訊息的分類 1 系統訊息 訊息id的範圍 0 0x03ff 1024個 系統已經定義的訊息,所以程式都可以直接 使用,例如 wm create等。2 使用者自定義訊息 訊息id範圍0x0400 0x7fff 由使用者自己定義,滿足使用者自己的需要。使用者 自己負責傳送,自己負責響應 處理 定義了...
樹莓派下的驅動開發
程式設計師的入門經典當然就是hello world程式了,我的第乙個實驗就是要搭建實驗環境和工具鏈,通過交叉編譯的方式,在上位機完成hello world驅動程式的編寫,最終在板子上執行。最終搭建的平台如下,後期的通訊可以直接使用串列埠,就不需要hdmi輸出了 我們在上位機編寫hello world...
DELPHI下的WINDOWS訊息傳遞機制
blog開了很久,專業的東西一點沒寫,今天既然已經坐下了,就寫點東西吧,也算調整調整心緒!開發基於windows平台的應用程式時,了解windows訊息系統組成是非常必要的。訊息本身是作為乙個記錄傳遞給應用程式的,記錄中包含訊息的型別以及其它的資訊!這個記錄型別叫做tmsg,它在windows單元中...