在多线程中,用到分割的视图时,会报错

huazaimh 2010-10-22 10:13:03
只要不是用在多线程中,就不会报错
static DWORD WINAPI RecvZJThread(LPVOID lpParam)
{
SOCKET sock = *((SOCKET *)lpParam);
int rc = 0;
char szBuf[4096] = {0};
int iRep = 0;

TRACE("================进入RecvZJThread==================\n");
while(1)
{
memset(szBuf, 0x00, sizeof(szBuf));
rc=recv(sock,szBuf,sizeof(szBuf) - 1,0);
szBuf[4094]='\0';
CString strMsg("");
for(int i=0 ;i<rc;i++)
{
if (szBuf[i]!='\0')
{
strMsg +=szBuf[i];
}

}
TRACE(strMsg);
// AfxMessageBox(*pcTmp);
// TRACE(szBuf);
//memcpy(szMsg.GetBuffer(0),szBuf,rc);

if(rc <= 0)
{
//CloseHandle(g_hRecvZJ);
//closesocket(sock);
//return 0;
}
else

{
CString szRes = ((CFrontCollectApp*)AfxGetApp())->g_pZJSendClient->DealWebDataFun(szBuf,rc);
CString strBuf;
strBuf.Format("%s",szBuf);
iRep = atoi(szRes);
if (szBuf[8] == 0x62)
{
if(atoi(szRes) == 0)
{
((CFrontCollectApp*)AfxGetApp())->m_iLoginFlag = 1;
TRACE("\n================收到中继登陆响应消息,成功==================\n");
CMainFrame *pWnd = (CMainFrame*)::AfxGetApp()->GetMainWnd();
// pWnd->DisplayMsg("dfdfddfdf");
}
else
{
((CFrontCollectApp*)AfxGetApp())->m_iLoginFlag = 0;

TRACE("\n================收到中继登陆响应消息,失败==================\n");
}

}
else
{
TRACE("\n ================收到中继采集响应消息              iRep=d==================\n", iRep);
CMainFrame *pWnd = (CMainFrame*)::AfxGetApp()->GetMainWnd();
CFrontCollectView* pView = pWnd->GetDataView();
pView->m_pMsg22->ParseMsg(szBuf, rc);
pView->m_pMsg22->ParseMsgXML();
CString szChNo = pView->m_pMsg22->CHNL_NO;
pView->ReceiveResponse(szChNo,iRep, "");

}
}
}

return 0;
}

这里的分割用的是静态分割,具体是什么原因,请各位高手指教!谢谢!
...全文
143 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
x396448534 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ta_v_sfiq_sfiq 的回复:]
CMainFrame *pWnd = (CMainFrame*)::AfxGetApp()->GetMainWnd();
把主窗体的指针用参数传
我以前也有这种情况,后来改成SENDMESSAGE
[/Quote]

这个很强大
huazaimh 2010-10-22
  • 打赏
  • 举报
回复
大家的意见比较统一,我来试试
谢谢大家,用自定义消息方式来试试吧。
Eleven 2010-10-22
  • 打赏
  • 举报
回复
从线程中发送自定义的消息出来,在消息的处理函数中处理
TA_V_SFIQ_SFIQ 2010-10-22
  • 打赏
  • 举报
回复
CMainFrame *pWnd = (CMainFrame*)::AfxGetApp()->GetMainWnd();
把主窗体的指针用参数传
我以前也有这种情况,后来改成SENDMESSAGE
visualwind 2010-10-22
  • 打赏
  • 举报
回复
在线程中不要直接操作窗口指针,包括AfxGetApp。
在线程中操作窗口指针很容易造成脏数据或者访问冲突而crash掉。
如果需要操作的话,SendMessage发送一个消息到主线程,在窗口响应中处理,处理完毕后通过SendMessage返回值返回或者通过全局变量返回(当然最好不要通过全局变量)。
ouyh12345 2010-10-22
  • 打赏
  • 举报
回复
贴了这么多代码,看着头晕
在多线程里,如果需要获得其它类的指针,请从参数里传递
ouyh12345 2010-10-22
  • 打赏
  • 举报
回复
需要socket的初始化环境
WSAInit

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧