AfxBeginThread(CMltiThrdView::ThreadFunc,
         &_ThreadArg[i],
         THREAD_PRIORITY_NORMAL,
         0,
         CREATE_SUSPENDED,
         NULL);用这个函数建立线程其中ThreadFunc 是CMltiThrdView类 STATIC 成员函数 CMltiThrdView类 派生于CVIEW
困惑于threadfunc 如何调用 CVIEW::GETDC() 成员函数??取得VIEW的 CDC 句柄完成对 VIEW 的绘制?
UINT  CMltiThrdView::ThreadFunc(LPVOID ThreadArg)
{
    CMltiThrdView::GetDC();
}
这样会报错 ThreadFunc 被定义为STATIC  不能调用非STATIC 的 GETDC();
请问在CMltiThrdView::ThreadFunc(LPVOID ThreadArg)函数中如何取得 CMltiThrdView的句柄??
简单 问题 小弟初学 望高手帮忙

解决方案 »

  1.   

    不能跨线程访问MFC对象。
    http://support.microsoft.com/default.aspx/kb/147578
      

  2.   

    MFC的很多类都不是线程安全的,可以将CView的HWND传递给WorkerThread,由它向主线程发送消息,再由主线程负责具体的处理。
      

  3.   


    请问,在线程中如何调用CList?????
      

  4.   

    线程函数不是有一个参数吗?LPVOID ThreadArg
    在启动线程的时候,有个参数对应该参数。
    CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
    //就是LPVOID pParam参数
    所以启动线程时把该参数用CView类的指针代替,如果有多个参数,可以定义个结构体,包含所有参数,然后把指针转进去,然后在线程函数中强转成你传进去之前类型的指针
    UINT  CMltiThrdView::ThreadFunc(LPVOID ThreadArg)
    {
        CView* pView = (CView*) ThreadArg;//AfxBeginThread中用的什么类型,这里就用什么类
                                          //型。当然也可以是父类的指针
        //CMltiThrdView::GetDC();
        //接下来要干什么就随便你了
    }PS:
    正如DentistryDoctor(My heart will fly,in the sky.) 说的,你要在线程中直接对界面操作的做法是很不明智的。多线程中对界面操作很容易出问题。