m_ListBox_Content.AddString(fhdjhdrj); 到这句话 出现 坛窗 Debug Assertion Failedprogram; c:\.................... Fine:f:\.............\afxwin2.inl Line:811 for information on how your program can cause an assertion failuer ,see the visual c++ documentation on assertion
(CcpppacDlg *)pParam->Ragasdghsd(shshsfrh);
void CcpppacDlg::Ragasdghsd(CString fhdjhdrj)
{
m_ListBox_Content.AddString(fhdjhdrj);}
到这句话
出现 坛窗
Debug Assertion Failedprogram;
c:\....................
Fine:f:\.............\afxwin2.inl
Line:811
for information on how your program can cause an assertion
failuer ,see the visual c++ documentation on assertion
{
CTabPage1 *pChatRoom = (CTabPage1 *)pParam;
ASSERT(pChatRoom != NULL);
pChatRoom->m_ListenSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
if ( pChatRoom->m_ListenSock == INVALID_SOCKET ) {
AfxMessageBox(_T("新建Socket失败!"));
return FALSE;
} int iPort = pChatRoom->GetDlgItemInt(IDC_EDIT1_pu);
if ( iPort <= 0 || iPort > 65535 ) {
AfxMessageBox(_T("请输入合适的端口:1 - 65535"));
goto __Error_End;
} sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = INADDR_ANY;
service.sin_port = htons(iPort); if ( bind(pChatRoom->m_ListenSock, (sockaddr*)&service, sizeof(sockaddr_in)) == SOCKET_ERROR ) {
AfxMessageBox(_T("绑定端口失败!"));
goto __Error_End;
} if( listen(pChatRoom->m_ListenSock, 5) == SOCKET_ERROR ) {
AfxMessageBox(_T("监听失败!"));
goto __Error_End;
}
pChatRoom->ShowMsg(_T("系统信息:启动服务器成功!"));
// pChatRoom->m_bIsServer = TRUE;
// pChatRoom->EnableWindow(IDC_START_SERVER, FALSE);
// pChatRoom->EnableWindow(IDC_STOP_SERVER); while( TRUE && !(pChatRoom->bShutDown)) {
if ( SOCKET_Select(pChatRoom->m_ListenSock, 100, TRUE) ) {
sockaddr_in clientAddr;
int iLen = sizeof(sockaddr_in);
SOCKET accSock = accept(pChatRoom->m_ListenSock, (struct sockaddr *)&clientAddr , &iLen);
if (accSock == INVALID_SOCKET) {
continue;
}
CClientItem tItem;
tItem.m_Socket = accSock;
tItem.m_pMainWnd = pChatRoom;
tItem.m_strIp = inet_ntoa(clientAddr.sin_addr);
INT_PTR idx = pChatRoom->m_ClientArray.Add(tItem);
tItem.hThread = CreateThread(NULL, 0, ClientThreadProc, &(pChatRoom->m_ClientArray.GetAt(idx)), CREATE_SUSPENDED, NULL);
pChatRoom->m_ClientArray.GetAt(idx).hThread = tItem.hThread;
ResumeThread(tItem.hThread);
CString strMsg,shshsfrh;
shshsfrh=tItem.m_strIp;
strMsg = _T("客户端:") + tItem.m_strIp + _T(" 进入聊天室!");
pChatRoom->ShowMsg(strMsg);
// pChatRoom->SendClientsMsg(strMsg, &tItem); //CcpppacDlg *pChatRooom = (CcpppacDlg *)pParam;
// pChatRooom->Ragasdghsd(shshsfrh);
((CcpppacDlg *)pParam)->Ragasdghsd(shshsfrh);
Sleep(100);
}
}
__Error_End:
closesocket(pChatRoom->m_ListenSock);
return TRUE;
}
为何pParam既是CTabPage1又是CcpppacDlg类型的指针?
楼主,注意了没有:CTabPage1 *pChatRoom = (CTabPage1 *)pParam;
CcpppacDlg *pChatRooom = (CcpppacDlg *)pParam;上两行,都是取pParam为窗口指针,
你编译CTabPage1 *pChatRoom = (CTabPage1 *)pParam;正确了
编译CcpppacDlg *pChatRooom = (CcpppacDlg *)pParam;不正确
说明pParam不是CcpppacDlg的指针,或者说CTabPage1与CcpppacDlg是不同的窗口
2.CcpppacDlg在哪儿这只有你知道啊我只能猜,你先回答下,这是不是个子窗口?多给点信息
CTabPage2Dlg; // 窗口类CTabPage1Page2; // 无窗口类(类名字你自己取)线程中调用无窗口类CTabPage1Page2,在无窗口类CTabPage1Page2中发送消息到不同的窗口CTabPage1Dlg,CTabPage2Dlg
我用了 tab control
控件
我的主窗体有个list box
控件 我想在这个函数里 把ip写道list box
CcpppacDlg主窗体
CTabPage1副
CTabPage2
CTabPage3
CcpppacDlg主窗体
CTabPage1副
CTabPage2
CTabPage3
都是不同的窗口。所谓不同的窗口,只要里面的控件数量、类型不同,它就不同,你的调用就会出问题。只能按大家说的,不要在工作线程直接操作窗口。你可以按我上面说的方法(我的做法)去做。或者用发送消息的方式操作窗口。
CTabPage2Dlg; // 只有控件ID_1 当你按你上面的统一的方式操作窗口指针,对两个窗口都是同样的操作,当操作到ID_2时,就会出错,因为CTabPage2Dlg没有ID_2。