窗体分割后,各视图线程间通信有关问题,访问冲突,求高手

窗体分割后,各视图线程间通信问题,访问冲突,求高手
本帖最后由 wonderhui 于 2012-11-05 15:19:52 编辑 我建了一个单文档,分割窗体为1、2型,左边加载的是TreeView,右边两个都是FormView,为了通信,在一个CSocket类中监听,有连接(OnAccept)就新建线程,并交给CControlSocket类处理。InitInstance()是线程类的初始化函数,这里要调用TraceShow()进行信息的显示,显示在分割窗体右下角对话框(FormView)的listboc中。代码及出错信息如下:
void CListenSocket::OnAccept(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CSocket sockit;
Accept(sockit);
/*SECURITY_ATTRIBUTES* sa = NULL;
sa->bInheritHandle = true;*/
CConnectThread* pThread = (CConnectThread*)AfxBeginThread(RUNTIME_CLASS(CConnectThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (!pThread)
{
sockit.Close();
TRACE("Could not create thread\n");
return;
}
pThread->m_CriticalSection.Lock();
m_ThreadList.AddTail(pThread);
pThread->m_CriticalSection.Unlock();
pThread->m_pWndServer = m_pWndServer;
pThread->m_hSocket = sockit.Detach();
pThread->ResumeThread();
CSocket::OnAccept(nErrorCode);
}
BOOL CConnectThread::InitInstance()
{
try
{
m_ControlSocket.Attach(m_hSocket);
m_ControlSocket.m_pThread = this;
CString strIPAddress;
UINT nPort;
m_ControlSocket.GetPeerName(strIPAddress, nPort);
LPCSTR str = "220 welcome";
m_ControlSocket.SendResponse(str);
TraceShow(str);
}
catch(CException *e) 
{
e->Delete();
}
return TRUE;
}
void TraceShow(LPCTSTR TraceContext)
{
CMainFrame* frm = (CMainFrame*)AfxGetMainWnd();
//frm->m_wndSplitterRight.SetActivePane(1,0);
CTraceView* pView = (CTraceView*)(frm->m_wndSplitterRight.GetPane(1,0));
//0x787b9f88(mfc90d.dll)处未处理异常:0xC0000005:读取位置0x01390220时发生访问冲突。
pView->m_trace.AddString(TraceContext);
}

访问冲突,调试断点在objcore文件的91行,
if(!AfxIsValidAdress((*lvoid**)p0b,sizeof(void*),false))

错误发生在CTraceView* pView = (CTraceView*)(frm->m_wndSplitterRight.GetPane(1,0));

必须先获取那个formview的句柄才能调用它的listbox,开线程之前怎么调TraceShow都没事,一到线程初始化那的TraceShow就出错,刚开始怀疑是不是线程间资源不能共享的问题,所以把TraceShow()变成全局函数,不行;开线程时想设置继承父线程资源(开线程前注释的那段),直接访问冲突。。。;想通过文档类遍历视图,在GetFirstViewPosition()就会报错了。。。已经纠结了两周了,各位高手帮帮忙!!


------最佳解决方案--------------------
一般来说,MFC的CWnd指针是不能在线程间共享的,用HWND比较安全
我当时也想不通,后来想想MFC就通了,还有你的CMainFrame* frm可能为空
MSDN中:
If AfxGetMainWnd is called from the application's primary thread, it returns the application's main window according to the above rules. If the function is called from a secondary thread in the application, the function returns the main window associated with the thread that made the call.


------其他解决方案--------------------
frm已经获取了值了,这个没问题。

最终是设置了个全局stringlist,在其他线程有数据时把数据写入,主线程设一个定时器,定时读取这个链表的值显示就解决了。
------其他解决方案--------------------
该回复于2012-12-01 09:16:29被管理员删除
------其他解决方案--------------------
该回复于2012-12-01 09:16:29被管理员删除