关于孙鑫老师的视频 第15课中最后一个简单的聊天程序中的一个问题

wulei5482 2010-03-17 01:27:46
在这个程序中,创建了一个现场专门用来接收消息。接收消息的函数为
DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)
{
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
//这里他是定义了一个结构体 把socket 和 对话框的句柄封装起来一起传进来
delete lpParameter; //视频讲述时,遗忘了释放内存的操作。sunxin

SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR);

char recvBuf[200];
char tempBuf[300];
int retval;
while(TRUE)
{
retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR==retval)
break;
sprintf(tempBuf,"%s说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
return 0;
}


问题 :1 既然对话框的句柄已经知道了。。为什么不直接用hwnd->SetDlgItemText()来设置编辑框的内容 而是用postMessage传递消息给对话框,然后用对话框的消息响应函数来设置编辑框的内容?
2 线程函数的标准形式 MSDN给出的如下
DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
);


请问 是不是用户只能改变函数名? 参数和返回值都必须和上面的一致?
因为,我把参数的名字改成了lpParam 然后在函数中 delete lpParam 就报错。。这是为什么呢?
注:这个函数是dialog类的静态成员函数!
可能问题描述的不清楚,希望有看过孙鑫老师的深入详解的人能帮助帮助。。。
3qverymuch
...全文
165 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
renguanqiao 2010-03-20
  • 打赏
  • 举报
回复
楼主可依照书上说的再好好看看 因为此处是基于SDK编程 也不是基于MFC 所以要发送消息
天堂大鸟 2010-03-20
  • 打赏
  • 举报
回复
创建线程。。。。
djh512 2010-03-20
  • 打赏
  • 举报
回复
HANDLE hThread = CreateThread(NULL,0,ThreadProc,(LPVOID)pRecvParam,0,NULL);
这个函数是什么意思 没怎么弄懂
99263 2010-03-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sk_sakula 的回复:]

因为他要传多个参数,所以用的是结构,但是类型是lprama的
[/Quote]
这只是一个地址的转换。
sk_sakula 2010-03-18
  • 打赏
  • 举报
回复
因为他要传多个参数,所以用的是结构,但是类型是lprama的
晒月光的青蛙 2010-03-17
  • 打赏
  • 举报
回复
楼上的正解
第二个问题,出错的原因与参数的名字无关
gslqy 2010-03-17
  • 打赏
  • 举报
回复
问题 :1 既然对话框的句柄已经知道了。。为什么不直接用hwnd->SetDlgItemText()来设置编辑框的内容 而是用postMessage传递消息给对话框,然后用对话框的消息响应函数来设置编辑框的内容?
2 线程函数的标准形式 MSDN给出的如下
DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
);


hwnd->SetDlgItemText...没这用法。 这是句柄,不是指针。

lpParameter. 形参当然可以改动, 至于出错的原因,我想可能是你CPP文件中改了, 头文件中没改
99263 2010-03-17
  • 打赏
  • 举报
回复
楼主如果是公司里面用的话,可以用商业的音视频开发包来搭建语音视频聊天室:[URL=http://www.anychat.cn]http://www.anychat.cn[/URL],楼主可以看看,可以免费下载。
yuznzhen426 2010-03-17
  • 打赏
  • 举报
回复
参数是可以更改的 ,你看看你是不是所有的用到lpParamter 都该过来了
SullenSun 2010-03-17
  • 打赏
  • 举报
回复
1.可以的 ::SetDlgItemText();
2,参数名可以改类型要一样,delete与new对应。。
kier2 2010-03-17
  • 打赏
  • 举报
回复
1:他用传递消息的方式,在消息响应函数里面不只是可以设置编辑框的内容,还可以加入其它操作,方便以后的修改。
2:delete lpParam 会报错是因为不知道指针类型吧,delete (RECVPARAM*)lpParam试试
精锐掷矛手 2010-03-17
  • 打赏
  • 举报
回复
delete lpParameter; //视频讲述时,遗忘了释放内存的操作。sunxin
=======================================================
给线程传的参数一般分配在堆上的,供线程整个运行期用的,线程退出时释放。

为什么不直接用hwnd->SetDlgItemText()来设置编辑框的内容 而是用postMessage
====================================
工作线程一般不直接操作界面,工作线程与UI线程通信用消息。原理你google吧。

16,472

社区成员

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

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

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