多线程中如何获得主框架指针

     线程分工作者线程和用户界面线程两种。

    线程创建函数原型:

    CWinThread* AfxBeginThread(
      AFX_THREADPROC pfnThreadProc,
      LPVOID pParam,
      int nPriority = THREAD_PRIORITY_NORMAL,
      UINT nStackSize = 0,
      DWORD dwCreateFlags = 0,
      LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
     );

    此函数用来创建工作者线程。
    CWinThread* AfxBeginThread(
      CRuntimeClass* pThreadClass,
      int nPriority = THREAD_PRIORITY_NORMAL,
      UINT nStackSize = 0,
      DWORD dwCreateFlags = 0,
      LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
     );

    此函数用来创建用户界面线程。

参数:

    pfnThreadProc    指向工作线程的控制函数。不能是NULL。这个函数必须按下面的方式定义:

                              UINT MyControllingFunction( LPVOID pParam );

    pThreadClass      从CWinThread继承的对象的RUNTIME_CLASS。

    pParam               将要传送给控制函数的参数,如pfnThreadProc中定义的函数参数所示。

    nPriority              设定的线程的优先级。如果为0,则使用与创建它线程相同的优先级。

    nStackSize          指定新线程使用的栈的以字节为单位的大小。如果为0,则缺省的栈大小与创建

                              它的线程的栈大小相同。 

    dwCreateFlags    指定控制线程的创建过程的附加标志。这个标志可以是两个值之一:

                              CREATE_SUSPENDED 经过一个延迟后启动这个线程。这个线程将在调

                                                                     用ResumeThread 以后才会启动。

                              0                                     创建后立即启动这个线程。 

 

lpSecurityAttrs    指向一个SECURITY_ATTRIBUTES结构,它指定了线程的安全特性。

                           如果为空,将使用与创建它的线程相同的安全特性。 

1.创建工作者线程可用AfxBeginThread(pfnThreadProc,LPVOID pParam);

可以通过将指定的对话框指针通过pParam传递给工作线程控制函数,在函数内部可以强制类型转换到以前的类型使用;多个参数的话可以通过定义结构体进行参数传递。

2.创建用户界面线程

2.1 使用ClassWizard创建类CWinThread的派生类(以CUIThread类为例)

2.2 重载函数InitInstance()和ExitInstance()。

    BOOL CUIThread::InitInstance()
    {
          CFrameWnd* wnd=new CFrameWnd;
         wnd->Create(NULL,"UI Thread Window");
         wnd->ShowWindow(SW_SHOW);
         wnd->UpdateWindow();
         m_pMainWnd=wnd;
         return TRUE;
    }

2.3 创建新的用户界面线程

  void CUIThreadDlg::OnButton1()
  {
         CUIThread* pThread=new CUIThread();
         pThread->CreateThread();
   }
 蓝色字体部分如果我们此时要创建一个已有ID的对话框,那么就要先得到主对话框的指针,然后在对其进行创建、显示等操作。通过AfxGetMainWnd得到主对话框的指针进行创建,结果失败,查了下MSDN中的AfxGetMainWnd 其返回值说明如下:

如果服务器具有一个可以在容器内现场激活的对象,并且这个容器是活动的,则这个函数返回一个指向包含这个现场活动文档的框架窗口对象的指针。

当启用用户界面线程后,在其中只得到了该线程的指针而并非主框架窗口的指针。

解决方法先用AfxGetApp得到程序的theApp指针在调用GetMainWnd得到指针才是主框架的指针。

CMainFrame* pMf = (CMainFrame*)AfxGetApp()->GetMainWnd();

CMainFrame* pMf = (CMainFrame*)AfxGetApp()->m_pMainWnd;

以上两个语句效果相同。

 

后记:AfxGetApp()可以在工程的任意地方得到其App指针,然后调用GetMainWnd()就可得到主框架的指针进行其他的操作。工作者线程中也可用AfxGetApp()->m_pMainWnd得到主框架指针,pParam就可用来传递其他参数了。

              

 
 
   
   
   
   
     
 


  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值