windows系統是通過訊息驅動的,每移動一下滑鼠,點選一下螢幕都會產生乙個訊息。這些訊息會先被放在windows的乙個系統訊息佇列(先進先出)中,windows系統會為每乙個gui執行緒建立乙個執行緒訊息佇列,然後系統會從系統訊息佇列中取出乙個訊息放到對應的執行緒訊息佇列中。之後通過訊息迴圈從執行緒訊息佇列中取出訊息分發派遣到對應的視窗的視窗過程中。
因為執行緒訊息佇列是在核心中的,所以可以通過訊息佇列進行程序間通訊(ipc)。當然進行程序間通訊的兩個程序必須有gui執行緒才行,因為只有gui執行緒才有執行緒訊息佇列。
系統保留從0x0000---0x03ff(wm_user-1)的值用於系統定義的訊息,而使用者自定義訊息的範圍為0x0400(wm_user)---0x7fff。
訊息佇列中的訊息對應乙個訊息結構msg,包含了訊息的各個資訊。我們在利用訊息進行程序間通訊時是通過wparam和lparam傳遞訊息的。
typedef struct tagmsg msg, *pmsg, *npmsg, *lpmsg;
我們可以通過sendmessage或postmessage傳送訊息,但是sendmessage直接將訊息傳送到對應的視窗過程中並不放在訊息佇列裡,所以我們要想通過訊息佇列實現ipc應該使用postmessage。
postmessagea可以將訊息傳送到視窗控制代碼hwnd對應的執行緒訊息佇列中,postthreadmessagea可以將訊息傳送到執行緒控制代碼hthread對應的訊息佇列中。(這裡注意hwnd視窗控制代碼是屬於使用者物件的控制代碼一般通過findwindow函式獲取,而hthread是核心物件的控制代碼一般通過跨程序共享核心物件完成)
bool postmessagea(
hwnd hwnd,
uint msg,
wparam wparam,
lparam lparam
);
獲取訊息有一般使用peekmessage或getmessage。
peekmessage可以檢索當前呼叫執行緒的執行緒訊息佇列中指定的訊息,並不指定檢索後如何處理執行緒佇列中的訊息(刪除還是保留)。
bool peekmessagea(
lpmsg lpmsg,
hwnd hwnd,
uint wmsgfiltermin,
uint wmsgfiltermax,
uint wremovemsg
);
getmessage和peekmessage一樣,只不過其會在檢索到訊息後直接將訊息從對應的執行緒訊息佇列中刪除。
bool getmessage(
lpmsg lpmsg,
hwnd hwnd,
uint wmsgfiltermin,
uint wmsgfiltermax
);
程序間通訊IPC
這兩天學習了 unix 的程序間通訊 ipc,這裡面有幾個很重要的基本概念,特別是訊息佇列和我的畢設很有關係,因此多說幾句。以前學習的程序間通訊方式,一般都是經由 fork 或exec 開啟檔案,或經過檔案系統。而 ipc是程序間通訊方式的統稱。下面一一道來。一 管道 管道是最老的 ipc形式。管道...
程序間通訊 IPC
part2 index1.html part2 index2.html linux至少支援如下ipc機制 同時支援posix和system v方式 streams ipc機制,linux本身不支援,有乙個單獨的安裝包 可以跨pc的程序通訊 互斥鎖或條件變數 動態初始化 不能使靜態分配 在共享記憶體中...
程序間通訊IPC
乙個大型的應用系統,往往需要眾多程序協作,程序間通訊的重要性顯而易見。首先,程序間通訊至少可以通過傳送開啟檔案來實現,不同的程序通過乙個或多個檔案來傳遞資訊,事實上,在很多應用系統裡,都使用了這種方法。但一般說來,程序間通訊 ipc interprocess communication 不包括這種似...