线程间发送消息,如何携带大量信息? 本帖最后由 sunzhen6251 于 2011-06-13 10:39:15 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.那个叫窗口间,不叫线程间如果要用消息来传递数据的话,你的方法是首选,也是95%的人的选择,当然啦,还可以写文件,内存映射文件等,然后再用消息来通知也可以,很麻烦的。2.我不知道你用CreateThread创建的线程是如何接收到PostThreadMessage或者SendMessage消息的,除非你自己创建一个消息循环,否则这些消息时无法接收的最后还是要提醒LZ一下,不要把窗口和线程弄混淆了,感觉LZ现在就有点混淆了 线程需要用PostThreadMessage,本人经常用,效果不错!!!! 不仅可以跨线程,跨进程都可以,系统会帮你marshal 指针指向的数据 1. 不是跨进程的话,SendMessage/PostMessage都可以,跨进程的话,WM_COPYDATA比较简单2. new一个,然后PostThreadMessage 两个窗口之间传递消息,应该是两个进程传递,如果通过PostMessage或SendMessage只能传递int型。可以在两个窗口内通过窗口类名(或窗口标题)称查找,获取消息通讯句柄,通过WM_SETTEXT配合传递,WPARAM参数传递消息相关消息ID, LPARAM参数传递相关消息的参数部分;收到WM_SETTEXT消息后,再根据消息ID进行消息的内部转发处理。WM_SETTEXT消息的处理代码 .h文件定义 afx_msg void OnSetTextMsg(WPARAM wParam, LPARAM lParam); .cpp文件实现//消息映射ON_MESSAGE(WM_SETTEXT, OnSetTextMsg)//消息实现char cmdparam[256];void CMyDlg::OnSetTextMsg( WPARAM wParam, LPARAM lParam){ memset(cmdparam, 0, 256);//相关消息参数 wsprintf(cmdparam, "%s", (char*)lParam);//根据相应的消息类型,做内部消息处理 int cmdtype = (int)wParam;//来电显示 if(cmdtype == CALLDISPLAY) { 在这里处理,或发送消息另行处理 //PostMessage(CALLDISPLAY, 0, (LPARAM)cmdparam); } ......}Char user[256] = {0}; //必须是全局变量... HWND hWnd = ::FindWindow(“Window Class”, NULL); if (hWnd!=NULL) { Strcpy(user, “yonghu1”); :: SendMessage (hWnd, WM_SETTEXT , 消息ID, (LPARAM)user); } #7楼属于另类选手,赞一个SendThreadMessage???好像SengMessage就是送给线程的,所有没有那个Thread,PostMessage不能垮线程啊,因此有个PostThreadMessage吧 问题1:点击窗口A上的按钮,向窗口B发送消息,如果需要携带大量的数据,应该怎么弄呢?你的方法没有问题将A窗口的指针传递给B,然后在B中需要的时候访问A的成员这样需要加锁问题2:当我向CreateThread创建的线程发送消息并带有数据指针时,用的是PostThreadMessage,为什么没有SendThreadMessage呢?这时如果我要保证发送过去的指针在被线程处理之前是有效的,应该咋的弄啊?使用new在堆里,什么时候都有效 嗯,的确是有点弄混了我在自己的线程里有个循环,里面用GetMessage得到消息。另外还想问问,每个窗口是不是也是一个独立的线程啊?初学,见笑~ 嗯,对于第二个问题,我主要是担心PostThreadMessage过去以后,会造成指针失效。new一个的意思是把参数都放在堆里么?然后线程收到以后再销毁? 同样的代码运行 占的内存加倍 菜鸟请教如何使自己的运行程序始终保持在前端 IMemAllocator成员函数GetBuffer调用失败,怎么解决 MSN,QQ是如何做这么漂亮的界面的?? VC工程中怎么不用建新类工具加一个自己写的类 基于对话框的应用程序,如何在桌面上创建普通的窗口???? 【【【关于3D虚拟现实和OpenGL】】】,什么是DEM中的插值????? 关于回调函数的问题 初到上海,大家多帮忙啊! win98,win2000,redhat7.2多操作系统安装的问题 小弟不才,问一个MFC窗口调用的基本问题。 windows 串口编程 急!高手请进。。。
如果要用消息来传递数据的话,你的方法是首选,也是95%的人的选择,当然啦,还可以写文件,内存映射文件等,然后再用消息来通知也可以,很麻烦的。
2.
我不知道你用CreateThread创建的线程是如何接收到PostThreadMessage或者SendMessage消息的,除非你自己创建一个消息循环,否则这些消息时无法接收的最后还是要提醒LZ一下,不要把窗口和线程弄混淆了,感觉LZ现在就有点混淆了
2. new一个,然后PostThreadMessage
WM_SETTEXT消息的处理代码
.h文件定义
afx_msg void OnSetTextMsg(WPARAM wParam, LPARAM lParam);
.cpp文件实现
//消息映射
ON_MESSAGE(WM_SETTEXT, OnSetTextMsg)
//消息实现
char cmdparam[256];
void CMyDlg::OnSetTextMsg( WPARAM wParam, LPARAM lParam)
{
memset(cmdparam, 0, 256);
//相关消息参数
wsprintf(cmdparam, "%s", (char*)lParam);
//根据相应的消息类型,做内部消息处理
int cmdtype = (int)wParam;
//来电显示
if(cmdtype == CALLDISPLAY)
{
在这里处理,或发送消息另行处理
//PostMessage(CALLDISPLAY, 0, (LPARAM)cmdparam);
}
......
}Char user[256] = {0}; //必须是全局变量
.
.
.
HWND hWnd = ::FindWindow(“Window Class”, NULL);
if (hWnd!=NULL)
{
Strcpy(user, “yonghu1”);
:: SendMessage (hWnd, WM_SETTEXT , 消息ID, (LPARAM)user);
}
SendThreadMessage???好像SengMessage就是送给线程的,所有没有那个Thread,PostMessage不能垮线程啊,因此有个PostThreadMessage吧
你的方法没有问题
将A窗口的指针传递给B,然后在B中需要的时候访问A的成员
这样需要加锁问题2:当我向CreateThread创建的线程发送消息并带有数据指针时,用的是PostThreadMessage,为什么没有SendThreadMessage呢?这时如果我要保证发送过去的指针在被线程处理之前是有效的,应该咋的弄啊?使用new在堆里,什么时候都有效
嗯,的确是有点弄混了我在自己的线程里有个循环,里面用GetMessage得到消息。另外还想问问,每个窗口是不是也是一个独立的线程啊?初学,见笑~
嗯,对于第二个问题,我主要是担心PostThreadMessage过去以后,会造成指针失效。new一个的意思是把参数都放在堆里么?然后线程收到以后再销毁?