在这个程序中,创建了一个现场专门用来接收消息。接收消息的函数为
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
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
解决方案 »
- 侯捷 深入浅出MFC 11章中Scribble程序 为什么不能实现拆分功能啊
- 请问如何免注册调用OCX
- OnTimer问题
- 怎样判断一个U盘和MOD盘是否写了保护?
- 请达人指点,有关时间暂停问题?
- 用MS DataGrid时的问题:m_DGrid.SetRefDataSource((LPUNKNOWN)recordset.GetRecordset()); 这样设置应该能在DataGrid中正确显示recordse
- 跪求:我想做一个输入法,要调用微软拼音的一些接口,有谁知道微软拼音的接口?
- 怎样得到本机的端口状态?
- api有什么适用条件啊,各位?
- 想学linux 请问该从哪个系统开始啊
- socket 获取HTTP网页
- BITMAP结构成员的怪异问题,总是想不通!高分悬赏!
=======================================================
给线程传的参数一般分配在堆上的,供线程整个运行期用的,线程退出时释放。为什么不直接用hwnd->SetDlgItemText()来设置编辑框的内容 而是用postMessage
====================================
工作线程一般不直接操作界面,工作线程与UI线程通信用消息。原理你google吧。
2:delete lpParam 会报错是因为不知道指针类型吧,delete (RECVPARAM*)lpParam试试
2,参数名可以改类型要一样,delete与new对应。。
2 线程函数的标准形式 MSDN给出的如下
DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
);
hwnd->SetDlgItemText...没这用法。 这是句柄,不是指针。lpParameter. 形参当然可以改动, 至于出错的原因,我想可能是你CPP文件中改了, 头文件中没改
这个函数是什么意思 没怎么弄懂