CListCtrl类的问题,急等!

roline 2006-11-08 02:50:53
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;
}
中间很多代码都不用看,只是我主要标出来的代码有问题,大家帮我看看。我只是想问,我错在哪里了。。。。
...全文
95 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
折腾_苏州 2006-11-08
  • 打赏
  • 举报
回复
MFC类不是线程安全的.............
roline 2006-11-08
  • 打赏
  • 举报
回复
在InsertItem内部确实是执行了的,而且返回值也不见是错的啊,晕了
折腾_苏州 2006-11-08
  • 打赏
  • 举报
回复
你可以跟踪看下InsertItem函数的实现过程,里面有ASSERT断,其实InsertItem函数最终调用的也是::SendMessage(m_hWnd, LVM_INSERTITEM, 0, (LPARAM)pItem);,你填充下结构发送就是了
roline 2006-11-08
  • 打赏
  • 举报
回复
说详细点好么?你的意思是发个消息,然后重新写个消息函数来处理么?
还有,如果你说是使用指针出了问题的话,为什么我不要这几行代码,整个程序又没问题了呢?
if(recvBuf[4] == 0x35)
{
CString tmp;//
tmp.Format("%d",i+1);//不加这三条语句,运行时就不出错。
//但是完不成我想要的功能---满足条件就在表后加项。
index = listCtrl.InsertItem(listCtrl.GetItemCount(), tmp);//
折腾_苏州 2006-11-08
  • 打赏
  • 举报
回复
普遍问题了,线程里用了MFC类指针的操作,抛出断言了...
还是用发消息的方式吧:
::SendMessage(m_hWnd, LVM_INSERTITEM, 0, (LPARAM)pItem);

15,979

社区成员

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

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