当单击菜单“警报”时弹出对话框,并连接到一UPD服务器,对话框里有一列表控件,用来显示接收的数据, 
连接到服务器后,(服务器以5秒间隔不断发送数据)列表框可以显示接收的数据,但是当单关闭对话框时,按理说应该是断开了连接,但是服务器一发出数据,程序还是报错!!! 
试了好多种其它方式,都报错!!不知何解??? 关键代码 
//MainFrm.cpp ... void CMainFrame::OnAlarm() 

CAlarmDlg dlg; 
dlg.DoModal(); 

... //AlarmDlg.cpp 
...... 
BOOL CAlarmDlg::OnInitDialog()  

CDialog::OnInitDialog(); // TODO: Add extra initialization here 
m_listalarm.ModifyStyle(LVS_EDITLABELS,0L); 
m_listalarm.ModifyStyle(0L,LVS_REPORT); 
m_listalarm.ModifyStyle(0L,LVS_SHOWSELALWAYS); 
m_listalarm.SetExtendedStyle(LVS_EX_FULLROWSELECT ¦LVS_EX_HEADERDRAGDROP ¦ 
LVS_EX_GRIDLINES ¦LVS_EX_ONECLICKACTIVATE ¦LVS_EX_FLATSB);  
CImageList img;  
img.Create(1, 18, ILC_COLOR8 ¦ILC_MASK,2,2);    //这里的18就是高度 
m_listalarm.SetImageList(&img,LVSIL_SMALL); 
CString row[12] = { "日期", "时间", "区域名称", "区域类型", "警报类型", "Trace Type", "警报等级",  "光纤", "危险程度", "状态", "位置", "温度值", }; 
for( i=0; i <12; i++ ) 

m_listalarm.InsertColumn( i, row[i], LVCFMT_LEFT, 80 ); 

//////////////////////////////////////////////////////
//////////////////////////////////////////////////////
////////////////////////////////////以上定义m_listalarm风格,///////以下应该是出错的关键 
m_pAlarmThread = AfxBeginThread( ServerThread, this, THREAD_PRIORITY_NORMAL, 
0, CREATE_SUSPENDED, NULL ); 
if( m_pAlarmThread == NULL ) 

AfxMessageBox( "线程创建失败!" ); 
return 0; 

else 

m_pAlarmThread-> ResumeThread(); 

return TRUE;  

UINT ServerThread( LPVOID pParam ) 
{ WORD wVersionRequested = MAKEWORD( 1, 1 ); 
WSADATA wsaData; 
if( WSAStartup(wVersionRequested, &wsaData) != 0 ) //启动winsock服务 
return 0; 
if( wsaData.wVersion != wVersionRequested ) 

WSACleanup(); 
return 0; 
} CAlarmDlg* pDlg = (CAlarmDlg*)pParam; 
pDlg-> sockClient = socket( AF_INET, SOCK_DGRAM, 0 ); pDlg-> addrSrv.sin_addr.S_un.S_addr = inet_addr( "192.168.0.2" ); 
pDlg-> addrSrv.sin_family = AF_INET; 
pDlg-> addrSrv.sin_port = htons( 50000 ); int len = sizeof(SOCKADDR); 
CString strDate = ""; 
CString strTime = ""; 
char recvbuf[RECVMAX] = ""; sendto( pDlg-> sockClient, "connect", sizeof("connect"), 0, (SOCKADDR*)&pDlg-> addrSrv, len ); 
while( true ) 

if( recvfrom(pDlg-> sockClient, recvbuf, RECVMAX, 0, (SOCKADDR*)&pDlg-> addrSrv, &len) != SOCKET_ERROR ) 

strDate.Format( "%s", recvbuf ); 
pDlg-> m_listalarm.InsertItem( 0, strDate , 0);  /*如果把这两行屏蔽后,程序就不会出错,*/
pDlg-> m_listalarm.SetItemText( 0, 1, strTime ); /*会不会是内存释放问题??*/


closesocket(pDlg-> sockClient); 
WSACleanup(); 
return 0; 

报错对话框内容 
Microsoft Visual C++ Library(对话框标题) Debug Assertion Failed! 
Program:.... 
File:afxcmn.inl 
Line:144

解决方案 »

  1.   

    对话框 是结束了 但是用来接收数据的Thread 没有退出,所以pDlg 的数据可能都已经被释放,而你的Thread 还在使用它,肯定报错的。你因该 在对话框 关闭的时候,同志Thread 退出而且你看你的代码
    while( true ) 

    if( recvfrom(pDlg->  sockClient, recvbuf, RECVMAX, 0, (SOCKADDR*)&pDlg->  addrSrv, &len) != SOCKET_ERROR ) 

    strDate.Format( "%s", recvbuf ); 
    pDlg->  m_listalarm.InsertItem( 0, strDate , 0);  /*如果把这两行屏蔽后,程序就不会出错,*/
    pDlg->  m_listalarm.SetItemText( 0, 1, strTime ); /*会不会是内存释放问题??*/

    } 这个明显是个死循环嘛,根本没有退出的语句