最近在看linux系统书籍看到消息调度方面,便动手封装一个类似MFC简易的消息发送框架(参考实例,没有窗口句柄)。

关于框架设计的几点介绍:
    1.设计采用了自动释放消息节点方式(增加虚析构函数在内部做相关释放判断,即使用完不释放节点也没关系);
    2.设计采用了双向链表方式做消息绑定节点(为了方便起见,没有采用环形双向链表);
    3.SendMess采用直接调用消息函数方式;
    4.PostMess按照我的想法多个线程同时发送一个消息,那么这个消息调用次数进行叠加一直调用完成为止。

函数定义如下:

//第一个参数 消息ID,第二个参数 消息函数
#define  Test_AddOnMess(id,pthis)   AddMess(id,*pthis);//消息映射宏
void AddMess(int id,LRESULT (* pn)(WPARAM,LPARAM));LRESULT TestMess(WPARAM wp,LPARAM lp);//测试消息函数
//第一个参数 消息ID,第二个参数 指定附加的消息,第三个参数 指定附加的消息
int Test_SendMess(UINT mess,WPARAM wp,LPARAM lp);//SendMess函数
//第一个参数 消息ID,第二个参数 指定附加的消息,第三个参数 指定附加的消息
int Test_PostMess(UINT mess,WPARAM wp,LPARAM lp);//PostMess函数typedef struct Test_Mess //消息数据结构体
{int id;//消息IDvolatile int MessRun;//运行状态volatile int messNum;//运行次数LRESULT (* pn)(WPARAM wp,LPARAM lp);//消息函数Test_Mess *prev,*next; //链表节点
}*pTest_Mess;typedef struct Test_Run//消息执行结构体
{pTest_Mess test_Mess,test_Messhead;Test_Run(){test_Mess = test_Messhead = 0;}virtual ~Test_Run(){while (0 != test_Messhead){pTest_Mess dele;dele = test_Messhead->next;while (0 != test_Messhead->MessRun)//如果消息还没执行完成,等待执行完成为止;delete test_Messhead;test_Messhead = dele;}}
};
Test_Run testrun;

代码实现如下:

void AddMess(int id,LRESULT (* pn)(WPARAM,LPARAM))//消息绑定函数实现
{if (0 > id || 0 == pn){return ;}testrun.test_Mess = testrun.test_Messhead;if (0 != testrun.test_Mess)//检查是否ID号相同{while (id != testrun.test_Mess->id && 0 != testrun.test_Mess->next)testrun.test_Mess = testrun.test_Mess->next;if (id == testrun.test_Mess->id){return ;}}if (0 == testrun.test_Mess){testrun.test_Mess = new Test_Mess;testrun.test_Mess->next = 0;testrun.test_Mess->prev = 0;testrun.test_Messhead = testrun.test_Mess;}else{while (0 != testrun.test_Mess->next)testrun.test_Mess = testrun.test_Mess->next;testrun.test_Mess->next = new Test_Mess;testrun.test_Mess->next->next = 0;testrun.test_Mess->next->prev = testrun.test_Mess;}while (0 != testrun.test_Mess->next)testrun.test_Mess = testrun.test_Mess->next;testrun.test_Mess->id = id;testrun.test_Mess->MessRun = 0;testrun.test_Mess->pn = pn;testrun.test_Mess->messNum = 0;
}LRESULT TestMess(WPARAM wp,LPARAM lp)//测试消息函数实现
{return 0;
}int Test_SendMess(UINT mess,WPARAM wp,LPARAM lp)//SendMess函数实现
{pTest_Mess test_mess = testrun.test_Messhead;if (0 == test_mess){return -2;}while (mess != test_mess->id && 0 != test_mess->next)test_mess = test_mess->next;if (mess != test_mess->id){return -1;}test_mess->MessRun = 1;//这个参数的作用类似于锁,如果不执行完成 那么就达不到析构条件//因为是Send方式直接启动test_mess->pn(wp,lp);test_mess->MessRun = 0;return mess;//返回消息ID表示成功
}int Test_PostMess(UINT mess,WPARAM wp,LPARAM lp)//PostMess函数实现
{pTest_Mess test_mess = testrun.test_Messhead;if (0 == test_mess){return -2;}while (mess != test_mess->id && 0 != test_mess->next)test_mess = test_mess->next;if (mess != test_mess->id){return -1;}test_mess->MessRun = 1;test_mess->messNum++;//post的设计为多个线程同时发送一个消息,那么消息进行叠加一直执行完成所有消息为止while (0 < test_mess->messNum){test_mess->pn(wp,lp);test_mess->messNum--;}test_mess->MessRun = 0;return mess;
}

使用方式:

Test_AddOnMess(1,TestMess);//类似于MFC ON_Message 宏
Test_AddOnMess(2,TestMess);
Test_AddOnMess(3,TestMess);Test_SendMess(2,2,3);
Test_PostMess(3,5,6);

Windows消息映射及消息发送(SendMess、PostMess)实现相关推荐

  1. 【转】MFC消息映射详解(整理转载)

    消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息.例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息 ...

  2. 【MFC】MFC消息映射(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 消息映射宏 2.1 BEGIN_MESSAGE_MAP 2.2 DECLARE_MESSAGE_MAP 2.3 END_MESSAGE_MA ...

  3. MFc消息映射机制理解

    何谓消息.消息处理函数.消息映射? 消息简单的说就是指通过输入设备向程序发出指令要执行某个操作.具体的某个操作是你的一系列代码.称为消息处理函数.在SDK中消息其实非常容易理解,当窗口建立后便会有一个 ...

  4. MFC 教程【4_消息映射的实现】

    消息映射的实现 Windows消息概述 Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口.这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows. 消息的 ...

  5. 【MFC】MFC消息映射

    00. 目录 文章目录 00. 目录 01. 概述 02. 消息映射宏 2.1 BEGIN_MESSAGE_MAP 2.2 DECLARE_MESSAGE_MAP 2.3 END_MESSAGE_MA ...

  6. 用C#调用Windows API向指定窗口发送按键消息

    为什么80%的码农都做不了架构师?>>>    用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入 ...

  7. 用C#调用Windows API向指定窗口发送按键消息(转载)

    用C#调用Windows API向指定窗口发送按键消息 z 用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空 ...

  8. 转MFC消息映射梳理

    http://blog.csdn.net/phunxm/article/details/5640766 一.CWnd消息处理 一切从窗口(HWND)的创建说起,在MFC中,CWnd::CreateEx ...

  9. MFC六大核心机制之五、六:消息映射和命令传递

    作为C++程序员,我们总是希望自己程序的所有代码都是自己写出来的,如果使用了其他的一些库,也总是千方百计想弄清楚其中的类和函数的原理,否则就会感觉不踏实.所以,我们对于在进行MFC视窗程序设计时经常要 ...

最新文章

  1. 【经验】网络加速:pip
  2. 如何将一个列表当作元组的一个元素
  3. 线下沙龙 × 上海 | 小身材大能量!用英伟达智能小车Jetbot玩转深度学习
  4. [2014.5.22][UBUNTU]Ubuntu与Windows系统时间不同步的问题
  5. qt调用opencv汇总(2)
  6. java虚拟机采用UTF-16编码格式对字符进行编码
  7. python逐行写入excel_快来看看Python如何玩转Excel
  8. 计算机基础项目任务教学重构,面向计算思维培养的中职课程项目式重构研究
  9. Appium-关于appium的原生控件的 xpath 定位问题及常用方法
  10. SharePoint Manager 2007 国外高人写的管理工具,有特色,对学习moss有帮助
  11. SpaceX提交星链项目修订申请,计划用星际飞船发射3万颗卫星
  12. 80×86汇编常用指令
  13. [转载]梯度下降小结
  14. 如何打开php格式文件_如何打开php文件?
  15. 海康监控设备如何修改IP地址
  16. 一个根据用户名生成头像的库——@multiavatar/multiavatar在react中的使用
  17. 独立博客大全的SWOT分析
  18. python 读取.sgy地震文件到三维ndarray矩阵,(全网仅此一份)
  19. 《C++ primer》学习笔记(第二章)——变量和基本类型
  20. 【数据库基础】正则化(Normalization)P1:UNF、1NF、2NF、3NF

热门文章

  1. 原来使用 Spring 实现策略模式可以这么简单!
  2. 重磅!GitLab 在中国成立公司极狐,GitHub 还会远吗?
  3. 漫画: 可以给女朋友讲解 Linux 内核长啥样了
  4. Docker 安装 MySQL5.7
  5. 移动页面自适应手机屏幕宽度HTML5开发
  6. MiniDao 比Mybatis还灵活实用的J2EE 持久层轻量级解决方案
  7. Java+sql server+CallableStatement调用存储过程三种情况 (转)
  8. 工厂方法模式(Factory Method Pattern)
  9. 超好用Web草图工具Balsamiq Mockups
  10. LGP4173残缺的字符串