1.跨线程(同一个进程内)

如果,窗口是由非主线程创建的,那么,那个线程将会跑一个自己的窗口消息队列。调用SendMessage会切换到该线程上去执行。
主线程是个窗口线程,在另外一个工作线程中调用了窗口线程的SendMessage,那么执行的过程是:
1)工作线程挂起
2)切换到窗口线程,执行对应的消息处理
3)切换回工作线程

SendMessage : 如果指定窗口由调用线程创建,那么窗口过程会被当成一个子程序立即调用。如果指定窗口由另外一个线程创建,那么系统会切换到那个线程,并且调用合适的窗口过程。在线程之间传递的消息仅仅当接收线程执行message retrieval code才会被处理。发送线程会被堵塞直到接收线程处理完消息。但是,发送线程在等待的同时会处理收到的nonqueued messages 。为了阻止这一点,使用带有SMTO_BLOCK参数 的SendMessageTimeout .

在多线程的程序里面,最好不要操作CWnd的实例指针,而是用API函数操作HWND窗口句柄。

2.跨线程(不同的进程)

SendMessage对于在同一个线程中调用的话,直接调用的是当前线程所属窗口的窗口过程函数(WndProc);如果是跨线程调用SendMessage(),那个这个消息会被放在登记消息队列.登记消息队列中的消息优先级越高,越是能够得到优先响应,处理完成后返回给发送者线程.
  详细内容:
  如果调用SendMessage()的线程向该线程所建立的窗口发送一个消息, SendMessage()就很简单:它只是调用指定窗口的窗口过程,将其作为一个子例程,当窗口过程完成对消息的处理时,它向SendMessage()返回一个值,SendMessage()再将这个返回值 返回给调用线程即当前线程;
  但是,当一个线程向其他线程所建立的窗口发送消息,SendMessage()所做的工作就复杂很多(即使两个线程在同一个进程中也是如此).Windows要求建立窗口的线程处理窗口消息.所以当一个线程调用SendMessage()向一个由其他进程所建立的窗口发送一个消息,也就是向其他线程发送消息,发送者线程不可能处理窗口消息,因为发送者线程不是运行在接收者线程的地址空间中,因此不能访问相应窗口过程的代码和数据.实际上发送者线程要挂起,而由另外的线程处理消息.所以为了向其他线程建立的窗口发送消息,系统必须执行下面将讨论的动作:
  首先,发送的消息要追加到接收线程的发送消息队列,同时还为这个线程设定QS_SENDMESSAGE(后面将讨论).其次,如果接收线程已经在执行代码并且没有等待消息(如调用GetMessage,PeekMessage,或WaitMessage)发送的消息不会被处理,系统不能中断线程来立即处理消息.当接收进程在等待消息时,系统首先检查QS_SENDMESSAGE唤醒标志是否被设定,如果是,系统扫描发送消息队列中消息的列表,并找到第一个发送的消息.有可能在这个队列中有几个发送的消息.例如几个线程可以同时向同一个窗口分别发送消息.当发生这样的事时,系统只是将这些消息追加到接收线程的发送消息队列中.
  当接收线程等待消息时,系统从发送消息队列中取出第一个消息并调用适当的窗口过程来处理消息.如果在发送消息队列再没有消息了,则QS_SENDMESSAG标志被关闭.当接收线程处理消息的时候,调用SendMessage()函数的发送者线程被置为空闲状态(idle),等待一个消息出现在它的应答消息队列中.在发送的消息处理之后,窗口过程的返回值被登记到发送者线程的应答消息队列中.发送线程现在被唤醒,取出包含在应答消息队列中的返回值.这个返回值就是调用SendMessage()的返回值.这时,发送线程继续正常运行.
  当一个线程等待SendMessage()返回时,它基本上是处于空闲状态,但它可以执行一个任务:如果系统中另外一个线程向一个窗口发送消息,这个窗口是由这个等待SendMessage()函数返回的线程所建立的,则系统要立即处理发送的消息,在这种情况下,系统不必等待线程去调用GetMessage,PeekMessage或WaitMessage

SendMessage跨线程和跨进程相关推荐

  1. connect跨进程 qt_编写 Qt 跨线程异步调用器

    本文使用 Zhihu On VSCode 创作并发布 本文使用 CC BY-NC-SA 4.0 许可协议,转载请注明来源 一.设计背景 众所周知,Qt 的信号槽系统提供了线程安全的跨线程异步执行代码的 ...

  2. C#中利用委托实现多线程跨线程操作

    在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个 ...

  3. C# 学习笔记(8) 控件的跨线程访问

    C# 学习笔记(8) 控件的跨线程访问 本文参考博客 C#多线程 https://www.cnblogs.com/dotnet261010/p/6159984.html C# 线程与进程 https: ...

  4. c#基础,单线程,跨线程访问和线程带参数

    1 using System; 2 using System.Collections.Generic; 3 using System.Threading; 4 using System.Windows ...

  5. Qt笔记-QTcpSocket跨线程调用(官方推荐方法,非百度烂大街方法)

    TCP服务端的经典案例中有个例子,就是当收到TCP客户端连接后,线程池直接开一个线程然后把这个socket指针传到线程里面,依靠新开的线程进程业务处理. 但在Qt里面使用这个方式后,会报一个QTcpS ...

  6. ZeroMq实现跨线程通信

    ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...

  7. c#中如何跨线程调用windows窗体控件?

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...

  8. js 原生跨页面通信_DOM操作是跨线程的你知道吗?

    在JS世界里面浏览器有两个重要的功能,分为渲染引擎和JS引擎.渲染引擎专门负责渲染Html和css的,JS引擎是专门用来执行JS的.这两个引擎是在不同的线程里面,它们都自己做着自己的事情,互不打扰. ...

  9. Logback日志跨线程追踪实践

    Logback日志跨线程追踪实践 当我们程序在服务器上面跑的时候,是不是很多时候很难定位问题? 当一大堆繁杂的日志文件丢给你的时候,你如何能从中定位到问题? 本项目源码已经上传Github: gith ...

最新文章

  1. Android项目的目录结构
  2. c libxml2解析html,简单的libxml2 HTML解析示例,使用Objective-c,Xcode和HTMLparser.h
  3. struts2下拉框在不同情况下的各种用法
  4. can协议解析字符串的原理
  5. Codeforces 1093D Beautiful Graph
  6. 行啊,人工智能玩大了!
  7. 设树采用孩子兄弟表示法存放.用类c语言设计算法计算树的高度.,(数据结构课程设计分类题目.doc...
  8. union all会影响性能吗_哪些因素会影响悬臂式掘进机的性能?
  9. 音视频开发(33)----麦克风阵列入门(一)
  10. textfield获取其中内容_冲压工艺流程,常见冲压缺陷及消除方法,46页内容全面介绍冲压...
  11. 【Spring笔记】Spring配置
  12. Symantec 不用密码卸载
  13. (转)Windows Phone7页面导航
  14. 【VR】虚拟现实软件开发工具与技术
  15. 字符串匹配算法KMP详解
  16. mysql webmail ubuntu12.04 imap_如何在Ubuntu 18.04 LTS上安装最新的Roundcube Webmail
  17. OutOfMemoryError(OOM)和StackOverflowError(SOF)异常总结
  18. java人机猜拳模块流程图_基于java实现人机猜拳游戏
  19. java编程:放苹果
  20. 常见Shell编程脚本

热门文章

  1. Arduino 流水灯 从右往左亮起来,再从左往右亮起来
  2. C11-COBOL 文件处理
  3. matlab绘制三维奖杯图,我是如何获得“MathorCup”奖杯与万元奖金的?
  4. 如何把pdf转换成word软件在线
  5. 360系统重装大师装系统实例步骤
  6. 后疫情时代,美团是否会掉队?
  7. 中本聪会计算机编程,中本聪要暴露了?仅需简短片段 AI就能“指认”编代码的程序员...
  8. 企业网站后期如何维护?
  9. 云服务器的维护方法,网站服务器的维护方法
  10. Windows10 安装软件提示无效驱动器E:\,卸载程序,同样提示无效驱动器