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的原理与应用

本文详细解析了SendMessage在跨线程通信中的工作原理,包括同一进程内的线程间消息处理和不同进程间的通信机制。主要内容涉及线程消息队列、线程切换、消息处理流程以及线程等待与唤醒。强调了在多线程编程中避免直接操作CWnd实例,而是使用窗口句柄进行API操作的重要性。
最低0.47元/天 解锁文章
1678

被折叠的 条评论
为什么被折叠?



