1. 程式人生 > >Winddows 訊息佇列原理和程式設計例項

Winddows 訊息佇列原理和程式設計例項

原文連結:http://www.vckbase.com/index.php/wv/1593

在Cstore中,客戶端程式中各執行緒間的通訊機制採用的是windows訊息佇列。

本文主要包括以下內容:

1、簡單理解Windows的訊息

2、通過一個簡單的Win32程式理解Windows訊息

3、通過幾個Win32程式例項進一步深入理解Windows訊息

4、佇列訊息和非佇列訊息

5、WM_COMMAND和WM_NOTIFY

6、MFC的訊息對映

7、訊息反射機制

1、簡單理解Windows的訊息

訊息,就是指Windows發出的一個通知,告訴應用程式某個事情發生了。

舉個例子來說,滑鼠單擊某應用程式的一個按鈕。這時,Windows(作業系統)給應用程式傳送這個訊息,通知應用程式該按鈕被點選,應用程式將進行相應反應。

訊息一般用一個32位的數來標識,這個數唯一地標識這個訊息。這些訊息的識別符號一般在標頭檔案winuser.h 中定義,如:

1.#define WM_PAINT 0x000F 2.#define WM_QUIT 0x0012

其實訊息本身是一個MSG結構。MSG結構定義如下:

1.typedef struct tagMSG { 2.HWND hwnd; //接受訊息的視窗控制代碼 3.UINT message; //訊息識別符號 4.WPARAM wParam; //32位附加資訊 5.LPARAM lParam; //32位附加資訊 6.
DWORD time//訊息建立的時間 7.POINT pt; //訊息建立時滑鼠在螢幕座標系中的位置 8.} MSG;

也就是說,對於任何一個訊息,都有一個MSG變數與之對應,該變數包含了訊息的相關資訊。而我們在一般情況下,只使用訊息的訊息識別符號,該識別符號也唯一地代表了這個訊息。

舉個例子來說,當我們收到一個字元訊息的時候,message成員變數的值就是WM_CHAR,但使用者到底輸入的是什麼字元,那麼就由wParam和lParam來說明。wParam、lParam表示的資訊隨訊息的不同而不同。

Windows作業系統已經給我們定義了大量的訊息,這些訊息我們稱為系統訊息。除了系統訊息,我們還可以自己定義訊息,即自定義訊息。
值小於0x0400的訊息都是系統訊息,自定義訊息一般都大於0x0400。

系統訊息取值一般有如下規律,如表1:

範圍 意義
0x0001――0x0087 主要是視窗訊息
0x00A0――0x00A9 非客戶區訊息
0x0100――0x0108 鍵盤訊息
0x0111――0x0126 選單訊息
0x0132――0x0138 顏色控制訊息
0x0200――0x020A 滑鼠訊息
0x0211――0x0213 選單迴圈訊息
0x0220――0x0230 多文件訊息
0x03E0――0x03E8 DDE訊息
0x0400 WM_USER
0x0400――0x7FFF 自定義訊息

表1

在WINUSER.H中,我們有定義:

1.#define WM_USER 0x0400

對於自定義訊息,我們一般採用WM_USER 加一個整數值的方法定義自定義訊息,如:

1.#define WM_RECVDATA WM_USER + 1

如果您初次接觸Windows程式設計,或是初次接觸Windows訊息,對於上述解釋可能沒有看懂,這也不要著急,後面的例項將會逐步帶您對Windows的訊息程式設計有一個瞭解。

2、通過一個簡單的Win32程式理解Windows訊息

例程1:一個簡單的Win32程式程式碼(見附帶原始碼 工程M1)

開啟VC++ 6.0,新建一個Win32 Application,工程名為M1,在該工程新增C++ Source File,檔名為M1,在該檔案中新增如下程式碼:

01.//一個簡單的Win32應用程式 02. 03.//通過這個簡單的例項講解Windows訊息是如何傳遞的 04. 05.#include 06. 07.//宣告視窗過程函式 08. 09.LRESULT CALLBACK WndProc(HWND

相關推薦

Winddows 訊息佇列原理程式設計例項

原文連結:http://www.vckbase.com/index.php/wv/1593 在Cstore中,客戶端程式中各執行緒間的通訊機制採用的是windows訊息佇列。 本文主要包括以下內容: 1、簡單理解Windows的訊息 2、通過一個簡單的Win3

java呼叫rabbitmq訊息佇列傳送接收訊息例項

消費者Consumer.java程式碼 package com.rabbitMQ.pro; import com.rabbitmq.client.ConnectionFactory; impor

隱馬爾科夫鏈(hmm)基本原理簡單例項

title: 隱馬爾科夫鏈(hmm) tags: hmm,隱馬爾科夫鏈,基本原理 grammar_cjkRuby: true 隱馬爾科夫鏈基本介紹 隱馬爾科夫(Hidden Markov Model,HMM),瞭解一個演算法要做到:會其意,知其形。 引子 隱馬爾科夫

Linux訊息佇列與執行緒例項理解

相較於程序,執行緒不僅擁有程序的併發性,相互獨立等特點,更有佔用資源較少,效率高等特點。 建立執行緒 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)

訊息佇列概念使用場景 及ActiveMQ詳細入門使用教程

一、訊息佇列 訊息即是資訊的載體。為了讓訊息傳送者和訊息接收者都能夠明白訊息所承載的資訊(訊息傳送者需要知道如何構造訊息;訊息接收者需要知道如何解析訊息),它們就需要按照一種統一的格式描述訊息,這種統一的格式稱之為訊息協議。所以,有效的訊息一定具有某一種格式;而

訊息佇列原理總結

訊息佇列應用的場景 業務解耦:訊息佇列要解決的最本質問題,實現設計的單一性原則,不耦合其他模組的業務。 最終一致性:用來處理延遲不那麼敏感的“分散式事務”場景或者不重要的業務。 廣播:下游有很多系統

Java常用訊息佇列原理介紹及效能對比

訊息佇列使用場景 為什麼會需要訊息佇列(MQ)? 解耦 在專案啟動之初來預測將來專案會碰到什麼需求,是極其困難的。訊息系統在處理過程中間插入了一個隱含的、基於資料的介面層,兩邊的處理過程都要實現這一介面。這允許你獨立的擴充套件或修改兩邊的處理

RabbitMQ訊息佇列生產者消費者

概述 生產者生產資料至 RabbitMQ 佇列,消費者消費 RabbitMQ 佇列裡的資料。 詳細 一、準備工作 1、安裝 RabbitMQ 服務和 RabbitMQ Management。 2、在 RabbitMQ 管理介面建立使用者 test

MQ入門總結(一)訊息佇列概念使用場景

一、訊息佇列 訊息即是資訊的載體。為了讓訊息傳送者和訊息接收者都能夠明白訊息所承載的資訊(訊息傳送者需要知道如何構造訊息;訊息接收者需要知道如何解析訊息),它們就需要按照一種統一的格式描述訊息,這種統一的格式稱之為訊息協議。所以,有效的訊息一定具有某一種格式;而

Java中mqtt訊息佇列傳送訂閱訊息

1.首先搭建mqtt協議伺服器 2.上程式碼,下面是傳送和訂閱mqtt程式碼demo package io.test; import java.util.Date; import org.eclipse.paho.client.mqttv3.IMqttDelivery

linux中訊息佇列kfifo訊號量sem_t的用法

使用kfifo和sem_t配合來實現訊息佇列:由sem來管理目前可以傳送和接收的總的訊息數,由kfifo來儲存訊息。具體實現起來就是定義訊號量sem_t_send和sem_t_recv,sem_t_send設為max_num,sem_t_recv設為0。

android手機裸眼3D技術原理程式設計實現

1.裸眼3D手機從去年開始流行。做為一個賣點或者噱頭,為手機的輸入輸出提供一抹靈動的色彩。裸眼3D可以在二維的手機螢幕上不需要配戴VR眼鏡或者谷歌紙盒就能展示三維的世界的效果,一般來說要給使用者提供好的體驗,需要軟體硬體相結合實現。硬體一般需要支援裸眼3D的手機或者普通的手機

rabbitmq訊息佇列原理

一、rabbitmq架構 RabbitMQ是一個流行的開源訊息佇列系統,是AMQP(高階訊息佇列協議)標準的實現,由以高效能、健壯、可伸縮性出名的Erlang語言開發,並繼承了這些優點。rabbitmq簡單架構如下: 上圖簡單展示了rabbitmq的架構

MPI 概念、原理程式設計

Communication functions that involves all the process in a communicator are called collective communications. To distinguish betwee

訊息佇列原理及activeMQ基本知識點

activeMQ 1)廣義訊息佇列 a)訊息佇列本質:一次rpc變三次;內容儲存;合適的時間投遞 b)訊息佇列設計重點rpc通訊: 協議(http,tcp),序列化(二進位制流)儲存: 檔案/資料庫/記憶體消費關係處理: 訊息生產者,訊息消費者,訂閱關係事務/防丟防重/批量

Kafka訊息佇列原理總結

最近在測試kafka的讀寫效能,所以借這個機會了解了kafka的一些設計原理,既然作為分散式系統,我們還是按照分散式的套路進行分析。 Kafka的邏輯資料模型: 生產者傳送資料給服務端時,構造的是ProducerRecord<Integer, String>(

訊息佇列MQ技術的介紹原理

訊息佇列技術是分散式應用間交換資訊的一種技術。訊息佇列可駐留在記憶體或磁碟上,佇列儲存訊息直到它們被應用程式讀走。通過訊息佇列,應用程式可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此訊息。   訊息中介軟體概述    訊息佇列技術是分散式

多程序程式設計之程序間通訊-管道訊息佇列

1.程序間通訊 Linux作為一種新興的作業系統,幾乎支援所有的Unix下常用的程序間通訊方法:管道、訊息佇列、共享記憶體、訊號量、套介面等等。 2.管道 管道是程序間通訊中最古老的方式,它包括無名管道(或者匿名管道)和有名管道兩種,前者用於父程序和

Linux:使用多執行緒程式設計訊息佇列,實現兩個程序之間的聊天

思路: 一個檔案:建立一個執行緒和主函式,或者建立兩個執行緒主函式呼叫(我用這種)。 建立兩個訊息佇列, 一共兩個檔案,兩個佇列,四個程序 a.c    一個程序寫(訊息型別為1)   ---->>佇列     一個程序讀(訊息型別為2) b.c   一

linux網路程式設計之POSIX 訊息佇列 系列函式

#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/types.h>#include<unistd.h>#includ