关于sendmessage的处理

LL596214569 2018-08-14 09:59:33
MFC里面对sendmessage的描述是说会等到被发送的消息处理之后才会返回;我想知道这个“处理之后”是怎样一个过程,是send的消息是会被发送到接收线程的消息队列的最前端作为最高优先级来优先处理呢,还是说只是将这个消息发送到了接收线程的消息队列中但是一直等待到这个消息被处理完才返回??求大神赐教,要是能分享个相关的微软的官方文档就更好啦
...全文
779 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-08-16
  • 打赏
  • 举报
回复
《深入浅出MFC》
schlafenhamster 2018-08-16
  • 打赏
  • 举报
回复
同一进程 ,所有线程,在 同一地址 空间 中 ,所有 DefWinProc 都是 有效的,所以 消息 可以 通过 DefWinProc 直接处理。
消息 不必 进 队列 。
LL596214569 2018-08-16
  • 打赏
  • 举报
回复
引用 44 楼 schlafenhamster 的回复:
“sendmessage发出的消息是不进入消息队列的” 说的是 同进程 的消息 (即 DefWinProc 是 有效的)
不同进程 的sendmessage发出的消息是要进入消息队列的

额,那同一进程下的不同线程之间使用sendmessage发消息也是不进入消息队列的吗?
schlafenhamster 2018-08-16
  • 打赏
  • 举报
回复
“sendmessage发出的消息是不进入消息队列的” 说的是 同进程 的消息 (即 DefWinProc 是 有效的)
不同进程 的sendmessage发出的消息是要进入消息队列的
LL596214569 2018-08-16
  • 打赏
  • 举报
回复
引用 38 楼 schlafenhamster 的回复:
"我在线程中调用 sendmessage 发送的消息是 Nonqueued的 "
你 可以 试试 :你发不发的了 Nonqueued的 消息。



引用 3 楼 schlafenhamster 的回复:
window procedure 窗口处理 函数。
即 DefWinProc , 即 SendMessage 的 消息 通常 不 进入 消息 队列 的, 是 直接 调用 WinProc 函数。没有等的问题。
当然 对于 不同进程 的 SendMessage 就不是这样了 !


你先说sendmessage发出的消息是不进入消息队列的,又说用户是不能发出 Nonqueued 消息的,那sendmessage到底在干什么?我在线程里调用sendmessage时会发出什么消息才能够既不是 Nonqueued消息还能不排队?
LL596214569 2018-08-16
  • 打赏
  • 举报
回复
引用 50 楼 zhao4zhong1 的回复:
[quote=引用 49 楼 LL596214569 的回复:]
[quote=引用 47 楼 zhao4zhong1 的回复:]
《深入浅出MFC》

赵四老师,我不是对你有什么意见,也不是讨厌你,但是有时候你的回复真的感觉是废话。。。要是可以慢慢看书研究甚至有时间把MFC都研究完,谁还来这浪费积分发帖求助。。。。[/quote]
[/quote]
好,谢谢
LL596214569 2018-08-16
  • 打赏
  • 举报
回复
引用 51 楼 schlafenhamster 的回复:
给你一个 模拟 函数

LRESULT WINAPI MySendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
LRESULT ret;
// Get hProcess
DWORD pid;
GetWindowThreadProcessId(hWnd,&pid);
//
if(pid!=g_AppPid) // 1092
{// across processes !
ret=::SendMessage(hWnd,Msg,wParam,lParam);
}
else
{// same process. get winproc
WNDPROC OldProc = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC);
ret= OldProc(hWnd, Msg, wParam, lParam);
}
return ret;
}

好的,谢谢
schlafenhamster 2018-08-16
  • 打赏
  • 举报
回复
其实 Nonqueued的 消息 就是要 calls the window procedure 。
但 另一个 window procedure 不在 你的 地址空间 中 !
schlafenhamster 2018-08-16
  • 打赏
  • 举报
回复
给你一个 模拟 函数

LRESULT WINAPI MySendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
LRESULT ret;
// Get hProcess
DWORD pid;
GetWindowThreadProcessId(hWnd,&pid);
//
if(pid!=g_AppPid) // 1092
{// across processes !
ret=::SendMessage(hWnd,Msg,wParam,lParam);
}
else
{// same process. get winproc
WNDPROC OldProc = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC);
ret= OldProc(hWnd, Msg, wParam, lParam);
}
return ret;
}
赵4老师 2018-08-16
  • 打赏
  • 举报
回复
引用 49 楼 LL596214569 的回复:
[quote=引用 47 楼 zhao4zhong1 的回复:]
《深入浅出MFC》

赵四老师,我不是对你有什么意见,也不是讨厌你,但是有时候你的回复真的感觉是废话。。。要是可以慢慢看书研究甚至有时间把MFC都研究完,谁还来这浪费积分发帖求助。。。。[/quote]
LL596214569 2018-08-16
  • 打赏
  • 举报
回复
引用 47 楼 zhao4zhong1 的回复:
《深入浅出MFC》

赵四老师,我不是对你有什么意见,也不是讨厌你,但是有时候你的回复真的感觉是废话。。。要是可以慢慢看书研究甚至有时间把MFC都研究完,谁还来这浪费积分发帖求助。。。。
LL596214569 2018-08-16
  • 打赏
  • 举报
回复
引用 46 楼 schlafenhamster 的回复:
同一进程 ,所有线程,在 同一地址 空间 中 ,所有 DefWinProc 都是 有效的,所以 消息 可以 通过 DefWinProc 直接处理。
消息 不必 进 队列 。

哦哦 我大概懂了,请问你有没有这方面的资料可以分享给我一些,我需要整理一下把这个写成一个文档最好有一些理论依据;还有谢谢你有耐心的回复了我这么多
不破ARM终不还 2018-08-15
  • 打赏
  • 举报
回复
首先学习一些常用的电子元件的功能和特性,书店都有相关的电子书籍,可以参考。先从电路学着手,然后是模拟电子技术、数字电子技术,接下来是无线电、单片机等更专业的知识。
多参考一些实际的电路图,比如电子报、无线电之类的杂志,上面有许多电路实例和功能介绍。需要学习protel99SE软件还需要有电路,及模拟电子和数字电子的知识,其中protel99SE是对设计好的电路进行模拟和电路板的封装,设计需要对电路的知识及几种门电路和三级管,二极管等各种元件的性能特别熟悉。
多做试验,从一些简单实用的小电路做起。读懂电路原理图;认识电路里的每个元件作用及其工作原理
最后一定要坚持。
从零开始学习设计电路推荐书目:

《电工原理》、《电路分析》或《电路分析基础》

《低频电子线路》( 线性电子线路)

《高频电子线路》(非线性电子线路)

《数字电路》、《电子测量》、《信号与系统》等
不破ARM终不还 2018-08-15
  • 打赏
  • 举报
回复
首先学习一些常用的电子元件的功能和特性,书店都有相关的电子书籍,可以参考。先从电路学着手,然后是模拟电子技术、数字电子技术,接下来是无线电、单片机等更专业的知识。
多参考一些实际的电路图,比如电子报、无线电之类的杂志,上面有许多电路实例和功能介绍。需要学习protel99SE软件还需要有电路,及模拟电子和数字电子的知识,其中protel99SE是对设计好的电路进行模拟和电路板的封装,设计需要对电路的知识及几种门电路和三级管,二极管等各种元件的性能特别熟悉。
多做试验,从一些简单实用的小电路做起。读懂电路原理图;认识电路里的每个元件作用及其工作原理
最后一定要坚持。
从零开始学习设计电路推荐书目:

《电工原理》、《电路分析》或《电路分析基础》

《低频电子线路》( 线性电子线路)

《高频电子线路》(非线性电子线路)

《数字电路》、《电子测量》、《信号与系统》等
schlafenhamster 2018-08-15
  • 打赏
  • 举报
回复
队列 是 FIFO (first in ,first out)
LL596214569 2018-08-15
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
进程是 系统 调度的 (100模式左右),是 轮流 工作 的 ,这么 会 PostMessage发送了很多消息 !

而且就算假如忽略进程调度机制,假设消息队列里只留有一条待处理的消息,这时候给其sendmessage发送一个消息,那被send过来的这个消息是在以有的这个消息之前处理还是等待以有的消息处理完再处理?发送消息与接收消息的是不同线程。
LL596214569 2018-08-15
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
进程是 系统 调度的 (100模式左右),是 轮流 工作 的 ,这么 会 PostMessage发送了很多消息 !

PostMessage是我手动调用的啊,就是我现在有两个窗口A和B,我在A里面用PostMessage向B发送100个消息,每个消息里面都要sleep(1000);这样在B的消息队列里为什么不可能会有很多消息?
schlafenhamster 2018-08-15
  • 打赏
  • 举报
回复
进程是 系统 调度的 (100模式左右),是 轮流 工作 的 ,这么 会 PostMessage发送了很多消息 !
LL596214569 2018-08-15
  • 打赏
  • 举报
回复
引用 17 楼 schlafenhamster 的回复:
据我所知, timer 消息 优先度 低 但 高于 paint(最低), 而且多个 paint 消息 会合并。
至于“已经有了很多在排队的消息” 的 情况 不应该 经常出现 (否则 就是 计算机 速度 不够)

消息队列不一定只有paint这种系统消息啊,如果我在sendmessage之前先用PostMessage发送了很多消息,而这些消息处理很费事那它们就可能会滞留在消息队列里没有处理完,这时使用sendmessage发送一个消息就会出现我说的这种情况
schlafenhamster 2018-08-15
  • 打赏
  • 举报
回复
据我所知, timer 消息 优先度 低 但 高于 paint(最低), 而且多个 paint 消息 会合并。
至于“已经有了很多在排队的消息” 的 情况 不应该 经常出现 (否则 就是 计算机 速度 不够)
加载更多回复(32)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧