孙鑫vc15课聊天室自建创建消息,响应函数中没接收到值

smashqq 2011-09-02 12:13:39

DWORD WINAPI Funproc(LPVOID lpparameter){//这是线程函数,发送消息,下面的是消息响应函数
char recvBuf[100];
char tempBuf[100];

HWND hwnd = ((recvThread*)lpparameter)->h_Dlg;
SOCKET sock = ((recvThread*)lpparameter)->sockSrv;

SOCKADDR_IN addrRecv;
int len = sizeof(SOCKADDR);

int retval;
while (TRUE)
{

retval = recvfrom(((recvThread*)lpparameter)->sockSrv, recvBuf, sizeof(recvBuf), 0, (sockaddr*)&addrRecv, &len);

if (retval == SOCKET_ERROR)
{
break;
}
sprintf(tempBuf, "%s say: %s ", inet_ntoa(addrRecv.sin_addr), recvBuf);
//////////////////////////////////////////////////////////////前面不太重要
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//发送消息,这里tempBuf不是空值

}

return 0;
}
void CChatToolDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{

CString str=(char*)wParam; //这里的str是空值,不知道为什么???
CString strTemp;
GetDlgItemText(IDC_EDIT_RECV,strTemp);
str+="\r\n";
str+=strTemp;
SetDlgItemText(IDC_EDIT_RECV,str);
}
...全文
149 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
smashqq 2011-09-02
  • 打赏
  • 举报
回复
在别人的机器上好使,我无语了。
我运行孙鑫的源程序也正常啊,不知道为什么。
lwaly1989 2011-09-02
  • 打赏
  • 举报
回复
切,你自己发送消息的时候就是设定的空值,lParam才有值好不
smashqq 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gibsonboy 的回复:]
OnRecvData这个函数有没有放在PreTranslateMessage里边?
[/Quote]
没有PreTranslateMessage函数啊
snailfoot 2011-09-02
  • 打赏
  • 举报
回复
你创建线程时将主窗口句柄传进来了吗?
gibsonboy 2011-09-02
  • 打赏
  • 举报
回复
OnRecvData这个函数有没有放在PreTranslateMessage里边?
smashqq 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 agoago_2009 的回复:]
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//发送消息,这里tempBuf不是空值

void CChatToolDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{

CString str=(char*)wParam; //这里的str是空值,不知道为什么???
应该是 : ……
[/Quote]
改过了,一样的。
smashqq 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lwaly1989 的回复:]
切,你自己发送消息的时候就是设定的空值,lParam才有值好不
[/Quote]

::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//发送消息,这里tempBuf不是空值

调试的时候temBuf不是空值。

CString str=(char*)wParam; //这里的str是空值,不知道为什么???
这里是lParam,这地方是我写错了

就是这个lParam的值传不过来,str是空值。
gibsonboy 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 visualeleven 的回复:]

引用 8 楼 gibsonboy 的回复:
引用 6 楼 visualeleven 的回复:
最好用SendMessage();个人觉得他的这个程序是有问题的,PostMessage你发送数据要保证你上面的tempBuf有效。但是有可能会有这样的一种情况,就是你UI线程又有数据到来,然后你的子线程中刚好又PostMessage了,但是你的UI主窗口可能因为某些事件来不及处理,这个时候你的线程……
[/Quote]
PostMessage是传递的tempBuf的地址,但是tempBuf的数据会再线程的下一次的while循环中重新初始化然后赋值,再放到另外一条消息,只要保证消息都被处理就没有问题。
Eleven 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gibsonboy 的回复:]
引用 6 楼 visualeleven 的回复:
最好用SendMessage();个人觉得他的这个程序是有问题的,PostMessage你发送数据要保证你上面的tempBuf有效。但是有可能会有这样的一种情况,就是你UI线程又有数据到来,然后你的子线程中刚好又PostMessage了,但是你的UI主窗口可能因为某些事件来不及处理,这个时候你的线程又开始了下一次的while循环recvfrom接……
[/Quote]
你PostMessage传递的tempBuf的地址,但是tempBuf的数据会再线程的下一次的while循环中被修改
gibsonboy 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 visualeleven 的回复:]
最好用SendMessage();个人觉得他的这个程序是有问题的,PostMessage你发送数据要保证你上面的tempBuf有效。但是有可能会有这样的一种情况,就是你UI线程又有数据到来,然后你的子线程中刚好又PostMessage了,但是你的UI主窗口可能因为某些事件来不及处理,这个时候你的线程又开始了下一次的while循环recvfrom接收消息,这样可能导致tempBuf的数据被修改。
……
[/Quote]
就是因为怕UI主窗口可能因为某些事件来不及处理,所以才要将消息放到消息队列,保证发送的数据能一一被处理。“tempBuf的数据被修改”我不明白你的意思。tempBuf的数据存储在每条消息里边,只要保证消息一一被处理就行了,为什么会被修改?
反而我觉得SendMessage虽然能保证这条消息第一时间被处理,但是就像你说的,这时候UI主窗口可能因为某些事件来不及处理,那程序就出于无响应状态了,因为SendMessage还没返回,却得不到UI线程的响应。
个人观点,欢迎指正。
211lgp 2011-09-02
  • 打赏
  • 举报
回复
要不按3楼的方法改,要不按5楼的方法改,都成
Eleven 2011-09-02
  • 打赏
  • 举报
回复
最好用SendMessage();个人觉得他的这个程序是有问题的,PostMessage你发送数据要保证你上面的tempBuf有效。但是有可能会有这样的一种情况,就是你UI线程又有数据到来,然后你的子线程中刚好又PostMessage了,但是你的UI主窗口可能因为某些事件来不及处理,这个时候你的线程又开始了下一次的while循环recvfrom接收消息,这样可能导致tempBuf的数据被修改。
Gloveing 2011-09-02
  • 打赏
  • 举报
回复
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//发送消息,这里tempBuf不是空值

void CChatToolDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{

CString str=(char*)wParam; //这里的str是空值,不知道为什么???
应该是 : CString str=(char*)lParam;
gold_water 2011-09-02
  • 打赏
  • 举报
回复
你应该取lParam的值
gibsonboy 2011-09-02
  • 打赏
  • 举报
回复
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//发送消息,这里tempBuf不是空值

BOOL WINAPI PostMessage(
__in_opt HWND hWnd,
__in UINT Msg,
__in WPARAM wParam, //你的第三个参数为0
__in LPARAM lParam
);
CString str=(char*)wParam; //这里的str是空值,不知道为什么???

把消息改成 ::PostMessage(hwnd,WM_RECVDATA,(WPARAM)tempBuf,0);
smashqq 2011-09-02
  • 打赏
  • 举报
回复
搞定了
retval = recvfrom(((recvThread*)lpparameter)->sockSrv, recvBuf, sizeof(recvBuf), 0, (sockaddr*)&addrRecv, &len);

把((recvThread*)lpparameter)->sockSrv换成上面定义的sock 就行了。但是我不知道原因,上面
sock = ((recvThread*)lpparameter)->sockSrv啊,不是一样吗,谁给解释一下。
infolee 2011-09-02
  • 打赏
  • 举报
回复
什么意思啊,没看懂

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧