主题:VC静态切分窗口后有关线程间通信问题
窗口切分后,分别让两个View在窗口中显示,在其中的一个View中有开启了一个线程,这时
窗口间(或视类间)该如何通信?
我用VC6.0的应用程序向导生成单文档视图,项目名称为Vega1,其中自动生成的View为Veag1View,我用窗口切分方法生成2行1列的两个窗口,新建两个View类,分别是CShowVegaView类和CInstrumntView类(这两个未与文档关联),ShowVegaView在0行0列的窗口中显示,InstrumntView在1行0列中显示。
//------------------------------------------------------------------------------------
// MainFrm.h
Class CMianFrame: Public CFrameWnd
{
......
CSplitterWnd m_wndSplitter;
......
}
//------------------------------------------------------------------------------------
// MainFrm.cpp
BOOL CMainFrame::OnCreateClient(......)
{
......
CSize pansize,pansize1;
......
m_wndSplitter.CreateStatic(this,2,1);
m_wndSplitter.CraeteView(0,0,RUNTIME_CLASS(CShowVegaView),pansize,pcontext);
m_wndSplitter.CreateView(,0,RUNTIME_CLASS(CInstrumentView),pansize1,pcontext);
......
}
//--------------------------------------------------------------------------------
然后在void CShowVgaView::OnInitialUpdate()中利用建立开启线程函数BeginVegaThread(),继而使用AfxBeginThread()开启一个线程。
//------------------------------------------------------------------------------------
// CShowView.h
Class CShowView:CView
{
......
Public
SendData();
......
}
//------------------------------------------------------------------------------------
// CSHowView.cpp
void CShowVgaView::OnInitialUpdate()
{
CView::OnInitialUpdate();
BeginVegaThread();// 开启一个Vega线程
}
void CShowVegaView:BeginVegaThread()
{
......
CWinThread* m_pVegaThrea=AfxBeginThread(
RunVegaProc,// 开启vega线程的控制函数(该函// 数被定义为全局函数)
this,
THREAD_PRIORITY_NORMAL,
0,
0,
NULL);
......
}
我的本意是在新开启的线程RunVegaProc()里,把有关数据送到InstrumntView具有的对话框中显示出来。我采取的办法是:在新开启的线程里,建立一个CShowVgaView类的对象hParent,进而调用void CShowVegaView::SendData()获取CInstrumntView的指针,从而设置有关CinstrumntView中有关变量的值.
// 新线程对应的线程管理函数
UINT RunVegaProc(LPVOID pParam)// 工作者线程
{
CShowVegaView *hParent=(CShowVegaView*)pParam;
......
hparent->SendData();
}
void CShowVegaView::SendData()
{
CVega1App *pApp=(CVega1App*)AfxGetApp();
CMainFrame *pMainFrame=(CMainFrame*)pApp->m_pMainWnd;
CMainFrame *pFrame=(CMainFram*)pMainFrame->GetActiveFrame();
// 想获得CINstrumentView的一个指针,运行这块,若不开启新线程,程序可以正常执行,
// 若开启线程,则出现错误:Debug Asserts failed wincore.cpp Line991 或者 Line 845
CInstrumentView *pView=(CInstrumentView*)pFrame->m_wndSplitter.GetPane(1,0);
//------------------------------------------------------
Updata(false);
pView->m_Edit1=1;// CInstrumentView 的一个对话框变量
Updata();
//------------------------------------------------------
}
若不开启新线程,程序可以正常执行,可以获得想要的指针;若开启线程,则出现错误:Debug Assertion failed! Program:…\Vega1.exe File:wincore.cpp Line991 or Line 845,不能获得想要的指针。
在开启线程的情况下,如何才能获得另一个View类(CInstrumntView,派生于CFormView)的指针,进而可以调用函数CinstrumntView类的函数,进行有关变量的设置(如InstrumntView里Edit控件显示的值)?或者有没有较好的办法,能够使新开启的线程与其他View进行通信呢?
大家有没有什么好办法?
窗口间(或视类间)该如何通信?
我用VC6.0的应用程序向导生成单文档视图,项目名称为Vega1,其中自动生成的View为Veag1View,我用窗口切分方法生成2行1列的两个窗口,新建两个View类,分别是CShowVegaView类和CInstrumntView类(这两个未与文档关联),ShowVegaView在0行0列的窗口中显示,InstrumntView在1行0列中显示。
//------------------------------------------------------------------------------------
// MainFrm.h
Class CMianFrame: Public CFrameWnd
{
......
CSplitterWnd m_wndSplitter;
......
}
//------------------------------------------------------------------------------------
// MainFrm.cpp
BOOL CMainFrame::OnCreateClient(......)
{
......
CSize pansize,pansize1;
......
m_wndSplitter.CreateStatic(this,2,1);
m_wndSplitter.CraeteView(0,0,RUNTIME_CLASS(CShowVegaView),pansize,pcontext);
m_wndSplitter.CreateView(,0,RUNTIME_CLASS(CInstrumentView),pansize1,pcontext);
......
}
//--------------------------------------------------------------------------------
然后在void CShowVgaView::OnInitialUpdate()中利用建立开启线程函数BeginVegaThread(),继而使用AfxBeginThread()开启一个线程。
//------------------------------------------------------------------------------------
// CShowView.h
Class CShowView:CView
{
......
Public
SendData();
......
}
//------------------------------------------------------------------------------------
// CSHowView.cpp
void CShowVgaView::OnInitialUpdate()
{
CView::OnInitialUpdate();
BeginVegaThread();// 开启一个Vega线程
}
void CShowVegaView:BeginVegaThread()
{
......
CWinThread* m_pVegaThrea=AfxBeginThread(
RunVegaProc,// 开启vega线程的控制函数(该函// 数被定义为全局函数)
this,
THREAD_PRIORITY_NORMAL,
0,
0,
NULL);
......
}
我的本意是在新开启的线程RunVegaProc()里,把有关数据送到InstrumntView具有的对话框中显示出来。我采取的办法是:在新开启的线程里,建立一个CShowVgaView类的对象hParent,进而调用void CShowVegaView::SendData()获取CInstrumntView的指针,从而设置有关CinstrumntView中有关变量的值.
// 新线程对应的线程管理函数
UINT RunVegaProc(LPVOID pParam)// 工作者线程
{
CShowVegaView *hParent=(CShowVegaView*)pParam;
......
hparent->SendData();
}
void CShowVegaView::SendData()
{
CVega1App *pApp=(CVega1App*)AfxGetApp();
CMainFrame *pMainFrame=(CMainFrame*)pApp->m_pMainWnd;
CMainFrame *pFrame=(CMainFram*)pMainFrame->GetActiveFrame();
// 想获得CINstrumentView的一个指针,运行这块,若不开启新线程,程序可以正常执行,
// 若开启线程,则出现错误:Debug Asserts failed wincore.cpp Line991 或者 Line 845
CInstrumentView *pView=(CInstrumentView*)pFrame->m_wndSplitter.GetPane(1,0);
//------------------------------------------------------
Updata(false);
pView->m_Edit1=1;// CInstrumentView 的一个对话框变量
Updata();
//------------------------------------------------------
}
若不开启新线程,程序可以正常执行,可以获得想要的指针;若开启线程,则出现错误:Debug Assertion failed! Program:…\Vega1.exe File:wincore.cpp Line991 or Line 845,不能获得想要的指针。
在开启线程的情况下,如何才能获得另一个View类(CInstrumntView,派生于CFormView)的指针,进而可以调用函数CinstrumntView类的函数,进行有关变量的设置(如InstrumntView里Edit控件显示的值)?或者有没有较好的办法,能够使新开启的线程与其他View进行通信呢?
大家有没有什么好办法?