首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

编程基础有关问题 多线程内存溢出.

2012-07-28 
编程基础问题 多线程内存溢出...编译时没问题,点击按钮就有内存溢出问题,请问各位大哥我该如何修改代码呢?

编程基础问题 多线程内存溢出...
编译时没问题,点击按钮就有内存溢出问题,请问各位大哥我该如何修改代码呢?

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);

[解决办法]
发消息更新内容
[解决办法]
线程退出有问题
没有用开关两退出,等于是强制退出,肯定有资源泄露问题
[解决办法]
可以自定义消息..
发送一个消息后.
在消息处理函数里更新界面显示.

热点排行