读书人

监听线程中控制添加主对话框的组合框列

发布时间: 2012-01-16 23:36:51 作者: rapoo

监听线程中控制添加主对话框的组合框列表出问题
监听线程单独用(不添加对组合框的操作)正常
组合框单独用(主对话框中定义添加列表内容)正常

但两个结合一起就出错了,(MFC42D.DLL): 0xC0000005: Access Violation,据说是由于对未被指定使用的存储区操作引起的,但不知道怎么解决

本来是直接在线程中调用Dlg成员函数,后来说不好,就改用自定义消息,还是不好用

程序如下:

//监听线程响应函数
CCriticalSection cs;
(这个线程互斥的加与不加都是出错)
UINT ClientLoop(LPVOID pParam)
{
CMyServerDlg* pDlg = (CMyServerDlg*)::AfxGetMainWnd();
……

CSingleLock singlelock(&cs);
singlelock.Lock();

m_ClientList.AddTail(&m_cinfo);

singlelock.Unlock();

pDlg-> PostMessage(WM_LIST, 0, 0);//发送自定义消息

return 0;
}

//主对话框中响应消息的函数
void CMyServerDlg::OnAddList(WPARAM wParam, LPARAM lParam)
{
CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_CLIENTLIST_COMBO);
pCombo-> ResetContent();

POSITION pos = m_ClientList.GetHeadPosition();

for (int i=0; i <m_ClientList.GetCount(); i++)
{
CLIENT_INFO* pInfo = m_ClientList.GetNext(pos);
pCombo-> AddString(pInfo-> addr);//大概判断是从这开始出错的
}
pCombo-> SetCurSel(0);
return;
}

[解决办法]
仔细看了一下,你得问题不在于我上面帖子说得问题,而在于

m_ClientList.AddTail(&m_cinfo);


你把临时对象得指针加入到这个list中,那么这个对象随后被修改后,list里也将被修改

这就意味着list中多个entry实际上指向同一个对象

如果你需要AddTail,你需要用new分配一个对象,然后加进去,不能加临时变量得地址

读书人网 >VC/MFC

热点推荐