线程间通信常用的三种方法

多线程通信的方法主要有以下三种:

1.全局变量

进程中的线程间内存共享,这是比较常用的通信方式和交互方式。
注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。

2.Message消息机制
常用的Message通信的接口主要有两个:PostMessage和PostThreadMessage,

PostMessage为线程向主窗口发送消息。而PostThreadMessage是任意两个线程之间的通信接口。

2.1.PostMessage() 
函数原型:
    B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

参数:
    hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
    HWND.BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口
和弹出式窗口。消息不被寄送到子窗口。
    NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样。
    Msg:指定被寄送的消息。
    wParam:指定附加的消息特定的信息。
    IParam:指定附加的消息特定的信息。
    返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。
MS还提供了SendMessage方法进行消息间通讯,SendMessage(),他和PostMessage的区别是:

SendMessage是同步的,而PostMessage是异步的。SendMessage必须等发送的消息执行之后,才返回。
2.2.PostThreadMessage()

PostThreadMessage方法可以将消息发送到指定线程。
函数原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam, LPARAM lParam);

参数除了ThreadId之外,基本和PostMessage相同。
目标线程通过GetMessage()方法来接受消息。

注:使用这个方法时,目标线程必须已经有自己的消息队列。否则会返回ERROR_INVALID_THREAD_ID错误。可以用
PeekMessage()给线程创建消息队列。

3.CEvent对象

CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步。

时间: 2025-01-16 14:34:15

线程间通信常用的三种方法的相关文章

每日一招:牛市选股最常用的三种方法

每日一招:牛市选股最常用的三种方法 字体: 大 小 换肤: 收藏 2015-05-04 11:00:06 选中了好股票就可以牟取暴利,选错了个股,牛市里面也要亏大钱,这就是新一轮大牛市的全新特点.选股已成为广大投资者炒股成败的关键点!最重要的是下一阶段什么方法是最适合的呢?下面我们就作一些分析. 目前各种选黑马的方法,大体上可分为有三种:1,以业绩为主要选股依据的方法.2,是以炒作题材为主要依据的选股方法.3,是以博弈.相反理论及跟庄方法为主要依据的选股方法. 第1种方法以业绩为选股的主要依据,

简单看看ThreadPool的源码以及从中看出线程间传值的另一种方法

这几天太忙没时间写博客,今天回家就简单的看了下ThreadPool的源码,发现有一个好玩的东西,叫做”执行上下文“,拽名叫做:”ExecutionContext“. 一:ThreadPool的大概流程. 第一步:它会调用底层一个helper方法. 第二步:走进这个helper方法,我们会发现有一个队列,并且这个队列的item必须是QueueUserWorkItemCallback的实例,然后这就激发了我的 兴趣,看看QueueUserWorkItemCallback到底都有些什么? 第三步:走到

winform线程间操作UI的五种方法

经常因为需要在线程间操作UI而头疼,总结了一下,记录出来,以后方便查阅. 方法一 通过设置窗体属性,取消线程间的安全检查.(最简单,最省事,也是最不负责任的一种) 1 public partial class one : Form 2 { 3 public one() 4 { 5 InitializeComponent(); 6 Control.CheckForIllegalCrossThreadCalls = false;//取消线程间的安全检查 7 } 8 9 private void Fo

Jquery 页面初始化常用的三种方法以及Jquery 发送ajax 请求

第一种 $(document).ready(function(){ //文档就绪事件 }); 第二种是第一种的简略写法,效果上和第一种是等效的. $(function(){ //文档加载事件,整个文档加载完成后执行.就仅仅只需要加载所有的DOM结构,在浏览器把所有的HTML放入DOM tree之前就执行js效果.包括在加载外部图片和资源之前. }); 第三种 jQuery(function($){ }); window.onload=function(){ //onload事件是js 中的代码

jQuery页面加载初始化常用的三种方法

当页面打开时我们需要执行一些操作,这个时候如果我们选择使用jquery的话,需要重写他的3中方法,自我感觉没什么区 别,看个人喜好了,第二种感觉比较简单明了: 第一种: 复制代码代码如下: <script type="text/javascript" src="./js/jquery-1.7.min.js"></script> 复制代码代码如下: <script type="text/javascript"> 

linux c++ 加载动态库常用的三种方法

链接库时的搜索路径顺序:LD_LIBRARY_PATH --> /etc/ld.so.conf --> /lib,/usr/lib 方法1. vi .bash_profile    设置环境变量LD_LIBRARY_PATH并导出 另: LD_LIBRARY_PATH:启动时连接共享函数库,执行时打开动态函数库首先搜索的路径. LD_DEBUG:显示运行时的信息,如符号寻找和绑定,重定向,执行等等. 方法2.  a)直接在/etc/ld.so.conf 里添加库路径 b)新建文件,后缀为.co

js对象定义的最常用的三种方法

定义对象:属性和方法的结合体(变量和函数的结合体) 1.(***)var obj = {} 2.var obj = new Object(); 3.使用function定义对象 具体例子分别为: 1 // 1.定义obj的对象 2 // obj:对象名 3 var obj = { 4 // height,weight,sex称为对象的属性 5 height: 170, // 使用,分隔属性和方法 6 weight: 90, 7 sex: '大美女', 8 9 // say():称为对象的方法 1

Vue-Router来实现组件间跳转的三种方法

一.通过js的编程的方式 <!doctype html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue.js"></script> <!-- 引入文件 --> <script src="js/vue-router.js"><

三种方法保留小数位数

js代码部分为 var PI=3.1415192;var str=PI+""; //因为数字没法进行字符操作,所以需要先转换:var index=str.indexOf(".");//返回当前的字符的点的位置console.log(index); //1console.log(str.substr(0,index+3)); //3.14 //合并后的第一种写法console.log(str.substr(0,str.indexOf(".")+3)