| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 956 人关注过本帖
标题:疑问: 关于多个函数响应一个自定义消息 求解
只看楼主 加入收藏
草香
Rank: 2
来 自:陕西
等 级:论坛游民
帖 子:12
专家分:12
注 册:2010-10-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
疑问: 关于多个函数响应一个自定义消息 求解
我定义了自定义消息  MYMESSSAGE

添加了俩个 函数关联
ON_MESSAGE(MYMESSAGE,MyMemberFun)
ON_Message(MYMESSAGE,MyFun2)

俩个函数中有不同输出内容的  输出语句

当我SendMessage(MYMESSAGE)时

发现MyMemberFun 执行了 而 MyFun2 并未执行   网上搜索到的原因说是 第一个函数响应后 这个这个消息会被释放 第二个关联的函数不会响应

那如果我想要 做到 一个消息 同时触发俩个关联函数 该怎么做,  坐等高手帮忙
搜索更多相关主题的帖子: 函数 定义 疑问 求解 
2010-11-03 10:48
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:20 
一个消息 触发两个回调?.... 你可以在MyMemberFun 里调用MyFun2
2010-11-03 10:59
草香
Rank: 2
来 自:陕西
等 级:论坛游民
帖 子:12
专家分:12
注 册:2010-10-7
收藏
得分:0 
回复 2楼 hahayezhe
恩 这个我想过 但是我是想同时触发的。  难道要启用一个新的线程?
2010-11-03 11:37
kwbplcz
Rank: 2
等 级:论坛游民
帖 子:12
专家分:51
注 册:2010-11-3
收藏
得分:0 
一个消息要同时映射给两个函数,在VC++里基本做不到,
你说的这个概念有点像C#语言里的Delegate,C#本身有语法支持可以做到同时管理多个处理者,

但C++里的Delegate只能通过回调函数的方式实现,
而且更关键的是,C++里很难做到同时关联多个回调函数(除非自己实现);

MFC里的ON_MESSAGE是一个宏,
这个宏可以简单的理解为如下的代码:

程序代码:
#define ON_MESSAGE(message, memberFxn) \
    { \
        message, 0, 0, 0, AfxSig_lwl, \
        AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&memberFxn \
    },


而在实际运行的时候,
运行过程也可以入下理解:

程序代码:
int i;
for(i=0; i < dim(_messageEntries); i++) 
{
    if (message == _messageEntries[i].nMessage)
        return((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));


也就是说,

虽然你定义了
ON_MESSAGE(MYMESSAGE,MyMemberFun)
ON_Message(MYMESSAGE,MyFun2)

但是当系统收到MYMESSAGE消息时,
一旦找到MyMemberFun函数,
则执行完后就返回了,
而不会再继续去进行下一次的查找,
因此MyFun2自然也就执行不到;

所以,
要实现你的功能,
比较简单的办法就是:


首先,
自己定义一个回调函数的列表MyArray,
在该列表里可以保存多个处理函数的指针,

其次,
定义 ON_MESSAGE(MYMESSAGE,EntryFun);

最后,
在EntryFun函数里,
遍历MyArray列表,依次调用处理函数;

你可以去看看《深入浅出MFC》,上面对MFC的消息的处理有很透彻的分析。
上面的部分代码也是从上面复制下来的


[ 本帖最后由 kwbplcz 于 2010-11-3 16:34 编辑 ]

真的不想研究技术.
2010-11-03 16:30
快速回复:疑问: 关于多个函数响应一个自定义消息 求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029275 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved