当单击菜单“警报”时弹出对话框,并连接到一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
连接到服务器后,(服务器以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
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 ); /*会不会是内存释放问题??*/
}
} 这个明显是个死循环嘛,根本没有退出的语句