DWORD WINAPI CBaseDrawView::RecvThread(LPVOID lpParameter)
{
int i = (int)lpParameter;
CBaseDrawView *m_pBaseDrawView = (ip[i])->m_pBaseDrawView;
    SOCKET socketRecv = (ip[i])->sock;
CDC *pDC = m_pBaseDrawView->GetDC();
CMainFrame* pMainFrame=(CMainFrame*)AfxGetMainWnd();
CDataListView *pDataView=(CDataListView *)(pMainFrame->m_wndSplitter.GetView(pMainFrame->m_iDataView));
CListCtrl &listCtrl=pDataView->GetListCtrl();
CRect drawrect;
m_pBaseDrawView->GetClientRect(drawrect);
CString tmpcs;
tmpcs.Format("%d",i+1);
// LVFINDINFO FindInfo;
// FindInfo.flags = LVFI_STRING;
// FindInfo.psz = tmpcs;
// m_pBaseDrawView->index = listCtrl.FindItem(&FindInfo);
int k = listCtrl.GetItemCount();//
int index = listCtrl.InsertItem(k, tmpcs);//这两条是在表后添加记录
while(1)
{
CDC *pDC = m_pBaseDrawView->GetDC();
CMainFrame* pMainFrame=(CMainFrame*)AfxGetMainWnd();
CDataListView *pDataView=(CDataListView *)(pMainFrame->m_wndSplitter.GetView(pMainFrame->m_iDataView));
// CListCtrl &listCtrl=pDataView->GetListCtrl();
CRect drawrect;
m_pBaseDrawView->GetClientRect(drawrect); BYTE recvBuf[80]={0};
if(SOCKET_ERROR != recv(socketRecv, (char*)recvBuf, 80, 0))
{
if(recvBuf[3] == 'E')
{
AfxMessageBox("不能执行请求!");
}
else if((recvBuf[4] == 0x34) | (recvBuf[4] == 0x35))
{ ////////以下代码可以不看
if(index<0)
{
CString cs;
cs.Format("%d",i+1);
index = listCtrl.InsertItem(0,cs);
}
if(recvBuf[5] != 0x01)
{
tmpcs.Format("%d",i+1);
tmpcs.Format("%d",m_pBaseDrawView->m_strImgGroup[i].Data.Num03);
listCtrl.SetItemText(index,1, tmpcs); 
tmpcs.Format("%d",m_pBaseDrawView->m_strImgGroup[i].Data.Num05);
listCtrl.SetItemText(index,2,tmpcs);
tmpcs.Format("%d",m_pBaseDrawView->m_strImgGroup[i].Data.Num07);
listCtrl.SetItemText(index,3,tmpcs);
tmpcs.Format("%d",m_pBaseDrawView->m_strImgGroup[i].Data.Num10);
listCtrl.SetItemText(index,4,tmpcs);
tmpcs.Format("%d",m_pBaseDrawView->m_strImgGroup[i].Data.Num20);
listCtrl.SetItemText(index,5,tmpcs);
tmpcs.Format("%d",m_pBaseDrawView->m_strImgGroup[i].Data.Num50);
listCtrl.SetItemText(index,6,tmpcs);
tmpcs = m_pBaseDrawView->m_strImgGroup[i].Data.TimeStar.Format("%Y/%m/%d %H:%M:%S");
listCtrl.SetItemText(index,7,tmpcs);
tmpcs = m_pBaseDrawView->m_strImgGroup[i].Data.TimeUse.Format("%M:%S");
listCtrl.SetItemText(index,8,tmpcs); 
//listCtrl.SetItemText(index,9, &addr);
listCtrl.SetItemText(index,10, times);
listCtrl.SetItemText(index,11, dispModle);
listCtrl.SetItemText(index, 12, (LPCTSTR)temperature);
listCtrl.SetItemText(index, 13, (LPCTSTR)humidity);
listCtrl.SendMessage(WM_PAINT,0,NULL);
}
CString data,time;
data.Format(" 0.3: %d\r\n 0.5: %d\r\n 0.7: %d\r\n 1.0: %d\r\n 2.0: %d\r\n 5.0: %d\r\n"
,m_pBaseDrawView->m_strImgGroup[i].Data.Num03,m_pBaseDrawView->m_strImgGroup[i].Data.Num05,m_pBaseDrawView->m_strImgGroup[i].Data.Num07,
m_pBaseDrawView->m_strImgGroup[i].Data.Num10,m_pBaseDrawView->m_strImgGroup[i].Data.Num20,m_pBaseDrawView->m_strImgGroup[i].Data.Num50);

time = m_pBaseDrawView->m_strImgGroup[i].Data.TimeUse.Format(" Time:%M:%S \r\n");
data += time;
m_pBaseDrawView->m_strImgGroup[i].oldTextRect = m_pBaseDrawView->DrawMessageBox(pDC,m_pBaseDrawView->m_pMemDC,data.GetBuffer(data.GetLength()),
m_pBaseDrawView->m_strImgGroup[i].pointText,m_pBaseDrawView->m_strImgGroup[i].oldTextRect,drawrect);
   }//////////////////////////以上代码可以不看
   if(recvBuf[4] == 0x35)
   {
   CString tmp;//
   tmp.Format("%d",i+1);//不加这三条语句,运行时就不出错。
                               //但是完不成我想要的功能---满足条件就在表后加项。
  index = listCtrl.InsertItem(listCtrl.GetItemCount(), tmp);//
   if(recvBuf[5] == 0x00)
   { 
   m_pBaseDrawView->m_strImgGroup[i].ButtonState = FALSE;
   state[i] = 0;
   m_pBaseDrawView->DrawButton(i, TRUE);
   closesocket(socketRecv);
   return 0;
   }
   }
       } 
   m_pBaseDrawView->ReleaseDC(pDC);
}
return 0;
}
中间很多代码都不用看,只是我主要标出来的代码有问题,大家帮我看看。我只是想问,我错在哪里了。

解决方案 »

  1.   

    普遍问题了,线程里用了MFC类指针的操作,抛出断言了...
    还是用发消息的方式吧:
    ::SendMessage(m_hWnd, LVM_INSERTITEM, 0, (LPARAM)pItem);
      

  2.   

    说详细点好么?你的意思是发个消息,然后重新写个消息函数来处理么?
    还有,如果你说是使用指针出了问题的话,为什么我不要这几行代码,整个程序又没问题了呢?
    if(recvBuf[4] == 0x35)
       {
       CString tmp;//
       tmp.Format("%d",i+1);//不加这三条语句,运行时就不出错。
                                   //但是完不成我想要的功能---满足条件就在表后加项。
      index = listCtrl.InsertItem(listCtrl.GetItemCount(), tmp);//
      

  3.   

    你可以跟踪看下InsertItem函数的实现过程,里面有ASSERT断,其实InsertItem函数最终调用的也是::SendMessage(m_hWnd, LVM_INSERTITEM, 0, (LPARAM)pItem);,你填充下结构发送就是了
      

  4.   

    在InsertItem内部确实是执行了的,而且返回值也不见是错的啊,晕了
      

  5.   

    MFC类不是线程安全的.............