问一个SENDMESSAGE的问题 SENDMESSAGE函数不是立即返回的,那如果有多个线程同时向一个窗体发消息(用SENDMESSAGE),会不会造成这些线程的阻死? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SendMessage基本上就可以理解为调用目标窗口类的方法。 SendMessage会造成堵塞。因为每个线程都在等待答复。但响应只能逐个处理,不能并发 那我的函数是这样的threadfunc(...){ cstring m_strInfo; .... ... m_strinfo = "test info"; ::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)&m_strinfo); return 1;}些时系统会报错,好像m_strinfo的地址无效了,那如何处理这个问题呢,因为m_strinfo是局部变量,所以线程一退出m_strinfo就不再有效,那如何保证消息的处理函数可以得到正确的值呢,不是用全局量吧. 线程中发消息一般用 PostMessage 那我的函数是这样的threadfunc(...){ cstring m_strInfo; .... ... m_strinfo = "test info"; ::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)&m_strinfo); return 1;}些时系统会报错,好像m_strinfo的地址无效了,那如何处理这个问题呢,因为m_strinfo是局部变量,所以线程一退出m_strinfo就不再有效,那如何保证消息的处理函数可以得到正确的值呢,不是用全局量吧. 不知道你的应用如果你的线程只是为了发某个消息的话,大可不必用PostMessage如果是这样的话,你可以通过线程的函数的参数来传你要的地址(消息的参数LPARAM的值s) 举个例子,我的线程专门SOCKET接收信息,当SOCKET断开后或接收错误后,要向主界面(对话框)的列表框中写相应的信息 在threadfunc(...)之外提供存储空间,通过参数传递 goodsmaker,你的意思是不是指使用全局量 to lixiaosan:用POSTMESSAGE的话,线程一旦退出后,我的存消息内容的地址不就无效了吗,MESSAGE的处理函数就报错了,这怎么处理啊 全局的可以,不是全局的也可以.你上面说的:些时系统会报错,好像m_strinfo的地址无效了,那如何处理这个问题呢,因为m_strinfo是局部变量,所以线程一退出m_strinfo就不再有效,那如何保证消息的处理函数可以得到正确的值呢,不是用全局量吧.是因为那个hwnd是ListCtrl,如果是Edit或Static就不会有这个问题,你试试看.如果是,就有解决办法. 对不起,没看仔细,我的意思是如果是edit或static的话,你可以在线程中直接操作控件,不必发消息 有几点我说明一下:1.我的m_hWnd是对话框的名柄2.我的对话框消息处理函数是 onxxxxx(wparam wparam lparam lparam) { CString m_Info; m_strInfo = *(CString *)lparam; <- 问题是这 lstXXX.insertitem(....); .... }如果在线程中的那个地址无效了,则上面那句就会出问题我想的是,比如我有10个线程,每个线程退出时都会POST一个消息给对话框,而对话框的处理函数可以正确的得到这些信息并显示在LIST中 threadfunc(...){ cstring m_strInfo; .... ... CString *pstrinfo = new CString(); *pstrinfo = "test info"; ::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)pstrinfo); return 1;}onxxxxx(wparam wparam lparam lparam) { CString *pInfo = (CString *)lparam; lstXXX.insertitem(....); .... delete pInfo; } 代码没有测试,仅供参考!threadfunc(...){ cstring m_strInfo; .... ... m_strinfo = "test info"; char *pNewStr = new char[m_strInfo.GetLength()+1]; //new 出来的内存只有调用delete时才会释放 strcpy(pNewStr, m_strinfo.GetBuffer(0)); ::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)&pNewStr); return 1;}接收消息:char *p = (char*)lParam;TRACE("Message: %s", p);delete []p; 用VC改一段游戏代码,高额报酬,请高手帮帮忙 困扰了我一个星期我感觉要崩溃了,为什么有这种事. 编译Link问题,有经验的进来教一下怎样解决~ 很简单的问题 发布自己写的软件,想接项目的程序大大们进来拉 如何将bmp转化为ICO呢? 如何使用EnumWindow函数 SkinMagic换皮肤界面库V0.9发布了 多文档程序问题 新手紧急求救:窗口最小化发送什么消息? 请问 如何更换单文档的背景和其中按钮图案??
{
cstring m_strInfo;
....
...
m_strinfo = "test info";
::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)&m_strinfo);
return 1;
}些时系统会报错,好像m_strinfo的地址无效了,那如何处理这个问题呢,因为m_strinfo是局部变量,所以线程一退出m_strinfo就不再有效,那如何保证消息的处理函数可以得到正确的值呢,不是用全局量吧.
{
cstring m_strInfo;
....
...
m_strinfo = "test info";
::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)&m_strinfo);
return 1;
}些时系统会报错,好像m_strinfo的地址无效了,那如何处理这个问题呢,因为m_strinfo是局部变量,所以线程一退出m_strinfo就不再有效,那如何保证消息的处理函数可以得到正确的值呢,不是用全局量吧.
如果你的线程只是为了发某个消息的话,大可不必用PostMessage
如果是这样的话,你可以通过线程的函数的参数来传你要的地址(消息的参数LPARAM的值s)
些时系统会报错,好像m_strinfo的地址无效了,那如何处理这个问题呢,因为m_strinfo是局部变量,所以线程一退出m_strinfo就不再有效,那如何保证消息的处理函数可以得到正确的值呢,不是用全局量吧.是因为那个hwnd是ListCtrl,如果是Edit或Static就不会有这个问题,你试试看.如果是,就有解决办法.
1.我的m_hWnd是对话框的名柄
2.我的对话框消息处理函数是
onxxxxx(wparam wparam lparam lparam)
{
CString m_Info;
m_strInfo = *(CString *)lparam; <- 问题是这
lstXXX.insertitem(....);
....
}如果在线程中的那个地址无效了,则上面那句就会出问题
我想的是,比如我有10个线程,每个线程退出时都会POST一个消息给对话框,而对话框的处理函数可以
正确的得到这些信息并显示在LIST中
{
cstring m_strInfo;
....
... CString *pstrinfo = new CString();
*pstrinfo = "test info";
::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)pstrinfo);
return 1;
}
onxxxxx(wparam wparam lparam lparam)
{
CString *pInfo = (CString *)lparam;
lstXXX.insertitem(....);
....
delete pInfo;
}
threadfunc(...)
{
cstring m_strInfo;
....
...
m_strinfo = "test info";
char *pNewStr = new char[m_strInfo.GetLength()+1];
//new 出来的内存只有调用delete时才会释放
strcpy(pNewStr, m_strinfo.GetBuffer(0));
::postmessage(xxx.m_hwnd,mymessage,0,(LPARAM)&pNewStr);
return 1;
}
接收消息:
char *p = (char*)lParam;
TRACE("Message: %s", p);
delete []p;