首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

监听线程中控制添加主对话框的组合框列表出有关问题

2012-01-16 
监听线程中控制添加主对话框的组合框列表出问题监听线程单独用(不添加对组合框的操作)正常组合框单独用(主

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

但两个结合一起就出错了,(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分配一个对象,然后加进去,不能加临时变量得地址

热点排行