回 帖 发 新 帖 刷新版面

主题: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进行通信呢?
    大家有没有什么好办法?


回复列表 (共1个回复)

沙发

我现在也需要用,可是我不会用,悲哀!

我来回复

您尚未登录,请登录后再回复。点此登录或注册