编程基础有关问题 多线程内存溢出.
编程基础问题 多线程内存溢出...
编译时没问题,点击按钮就有内存溢出问题,请问各位大哥我该如何修改代码呢?
错误报告:
Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {155} normal block at 0x004BC8B0, 42 bytes long.
Data: <, Y > 2C FB 91 59 0C 00 00 00 0C 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {149} client block at 0x004BC830, subtype c0, 68 bytes long.
a CWinThread object at $004BC830, 68 bytes long
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {140} normal block at 0x004BCDF0, 40 bytes long.
Data: <, Y > 2C FB 91 59 0B 00 00 00 0B 00 00 00 01 00 00 00
Object dump complete.
程序“[3892] iPower.exe: 本机”已退出,返回值为 3 (0x3)。
------解决方案--------------------
在线程中不能修改界面,要修改界面需要向主线程发消息来实现,
不能在线程中这样做:pDlg->m_neirong=inet_ntoa(from.sin_addr);
pDlg->UpdateData(FALSE);
------解决方案--------------------
发消息更新内容
------解决方案--------------------
线程退出有问题
没有用开关两退出,等于是强制退出,肯定有资源泄露问题
------解决方案--------------------
可以自定义消息..
发送一个消息后.
在消息处理函数里更新界面显示.
编译时没问题,点击按钮就有内存溢出问题,请问各位大哥我该如何修改代码呢?
- C/C++ code
UINT _UDPThread(LPVOID lparam) { SOCKET socket1; CiPowerDlg *pDlg =(CiPowerDlg *)lparam; //InitWinsock(); WSADATA wsaData; int iErrorCode; if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL { WSACleanup(); return 1; } struct sockaddr_in local; struct sockaddr_in from; int fromlen =sizeof(from); local.sin_family=AF_INET; local.sin_port=htons(8080); ///监听端口 local.sin_addr.s_addr=INADDR_ANY; ///本机 socket1=socket(AF_INET,SOCK_DGRAM,0); bind(socket1,(struct sockaddr*)&local,sizeof(local)); while (1) { int len=0; char buffer[1024]="\0"; //printf("waiting for message from others-------------\n"); len=recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&fromlen); if (len!=SOCKET_ERROR) { pDlg->m_neirong=inet_ntoa(from.sin_addr); pDlg->UpdateData(FALSE); //SetDlgItemText(IDC_neirong,(LPCTSTR)inet_ntoa(from.sin_addr)); //printf("printf --%s\n",inet_ntoa(from.sin_addr)); for(int i=0;i<len;i++) { pDlg->m_neirong=buffer[i]; pDlg->UpdateData(FALSE); //SetDlgItemText(IDC_neirong,(LPCTSTR)buffer[i]); //printf("%0x",buffer[i]); } //printf("\n"); ////给cilent发信息 //sendto(socket1,buffer,len,0,(struct sockaddr*)&from,fromlen); } Sleep(1000); } closesocket(socket1); delete pThreadLisen; } //这个是开始监听按钮 void CiPowerDlg::OnBnClickedmy() { pThreadLisen=::AfxBeginThread(_UDPThread,this); }
错误报告:
Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {155} normal block at 0x004BC8B0, 42 bytes long.
Data: <, Y > 2C FB 91 59 0C 00 00 00 0C 00 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {149} client block at 0x004BC830, subtype c0, 68 bytes long.
a CWinThread object at $004BC830, 68 bytes long
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {140} normal block at 0x004BCDF0, 40 bytes long.
Data: <, Y > 2C FB 91 59 0B 00 00 00 0B 00 00 00 01 00 00 00
Object dump complete.
程序“[3892] iPower.exe: 本机”已退出,返回值为 3 (0x3)。
------解决方案--------------------
在线程中不能修改界面,要修改界面需要向主线程发消息来实现,
不能在线程中这样做:pDlg->m_neirong=inet_ntoa(from.sin_addr);
pDlg->UpdateData(FALSE);
------解决方案--------------------
发消息更新内容
------解决方案--------------------
线程退出有问题
没有用开关两退出,等于是强制退出,肯定有资源泄露问题
------解决方案--------------------
可以自定义消息..
发送一个消息后.
在消息处理函数里更新界面显示.