zoukankan      html  css  js  c++  java
  • 多线程专题之MFC创建线程(2)

    现在,我们再写一下带有消息循环的线程

    1 从CWinThread派生自己的类(CAfxThread) :

    class CAfxThread : public CWinThread
    {
     DECLARE_DYNCREATE(CAfxThread)
    protected:
     CAfxThread();           // protected constructor used by dynamic creation

    // Attributes
    public:

    // Operations
    public:

    // Overrides
     // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(CAfxThread)
     public:
     virtual BOOL InitInstance();
     virtual int ExitInstance();
     //}}AFX_VIRTUAL

    // Implementation
    protected:
     virtual ~CAfxThread();

     // Generated message map functions
     //{{AFX_MSG(CAfxThread)
      // NOTE - the ClassWizard will add and remove member functions here.
     afx_msg void OnAfxTest1Msg(WPARAM wParam, LPARAM lParam);
     afx_msg void OnAfxTest2Msg(WPARAM wParam, LPARAM lParam);
     afx_msg void OnAfxHelloMsg(WPARAM wParam,LPARAM lParam);
     //}}AFX_MSG

     DECLARE_MESSAGE_MAP()
    };

    CAfxThread::CAfxThread()
    {
    }

    CAfxThread::~CAfxThread()
    {
    }

    BOOL CAfxThread::InitInstance()
    {
     // TODO:  perform and per-thread initialization here
    /*
    //实现用户界面线程
     CFrameWnd* pWnd = NULL;

     pWnd = new CFrameWnd;
     if ( pWnd )
     {
      pWnd->Create(NULL,"UI Thread Window");
      pWnd->ShowWindow(SW_SHOW);
      pWnd->UpdateWindow();
      m_pMainWnd = pWnd;
     }
     return TRUE;
    */
    /* CMultiThreadDlg dlg;
     m_pMainWnd = &dlg;

     dlg.DoModal();
     
     return FALSE;*/
     return TRUE;
    }

    int CAfxThread::ExitInstance()
    {
     // TODO:  perform any per-thread cleanup here
     AfxMessageBox( _T("Oh ! I Know It! Bye!") );
     return CWinThread::ExitInstance();
    }

    BEGIN_MESSAGE_MAP(CAfxThread, CWinThread)
     //{{AFX_MSG_MAP(CAfxThread)
      // NOTE - the ClassWizard will add and remove mapping macros here.
     ON_THREAD_MESSAGE(WM_AFX_TEST1_MSG,OnAfxTest1Msg)
     ON_THREAD_MESSAGE(WM_AFX_TEST2_MSG,OnAfxTest2Msg)
     ON_THREAD_MESSAGE(WM_AFX_HELLO_MSG,OnAfxHelloMsg)
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CAfxThread message handlers

    void CAfxThread::OnAfxTest1Msg( WPARAM wParam, LPARAM lParam )
    {
     MessageBox(NULL,_T("Hello World!"),_T("Test"),MB_OK);
    }

    void CAfxThread::OnAfxTest2Msg( WPARAM wParam, LPARAM lParam )
    {
     MessageBox(NULL,_T("Hello World!"),_T("Test"),MB_OK);
    }

    void CAfxThread::OnAfxHelloMsg(WPARAM wParam,LPARAM lParam)
    {
     AfxMessageBox( _T("Hello! I'm A Thread!") );
     ::PostThreadMessage( AfxGetApp()->m_nThreadID, WM_AFX_HELLO_MSG, m_nThreadID, 0 );
    }

    2 定义自定义消息宏:

    #define WM_AFX_TEST1_MSG WM_USER + 100
    #define WM_AFX_TEST2_MSG WM_USER + 101
    #define WM_AFX_HELLO_MSG WM_USER + 102

    3 下面看看如何创建线程吧:

    #include "AfxThread.h"
    void CMultiThreadDlg::OnBtnUsageFour()
    {
     // TODO: Add your control notification handler code here
    //无界面,但有消息循环的线程
     CWinThread *pThread = NULL;
     
     pThread = AfxBeginThread (
      RUNTIME_CLASS(CAfxThread),      //线程类
      THREAD_PRIORITY_NORMAL,       //线程优先级
      0,            //Windows系统一般线程栈大小为1 MB,创建线程的数目与物理内存和栈空间大小有关
      0,            //线程创建标志,如:CREATE_SUSPENDED
      NULL );           //系统安全描述,NULL
     
     if ( pThread )
     {
      pThread->PostThreadMessage( WM_AFX_TEST1_MSG, 0, 0 );
      Sleep(2000);         //如果去掉这个就会丢失消息。呵呵,不信,你试试!
      pThread->PostThreadMessage( WM_AFX_TEST2_MSG, 0, 0 );
      //::PostThreadMessage( pThread->m_nThreadID, WM_AFX_TEST2_MSG, 0, 0 );
      //这两种向线程发送消息的方法都可以
      /*---------------------------------------------------------------------------*\
      Call PostThreadMessage.
      If it fails, call the Sleep function and call PostThreadMessage again.
      Repeat until PostThreadMessage succeeds.
      \*---------------------------------------------------------------------------*/

      Sleep(2000);
      pThread->PostThreadMessage( WM_QUIT, 0, 0 );//退出线程
     }
    }

    void CMultiThreadDlg::OnBtnUsageFive()
    {
     // TODO: Add your control notification handler code here
    //有界面的线程,当然了,也有消息循环了哦
    /*
     AfxBeginThread (
      RUNTIME_CLASS(CAfxThread),      //线程类
      THREAD_PRIORITY_NORMAL,       //线程优先级
      0,            //Windows系统一般线程栈大小为1 MB,创建线程的数目与物理内存和栈空间大小有关
      0,            //线程创建标志,如:CREATE_SUSPENDED
      NULL );           //系统安全描述,NULL
     //消息循环会随着窗口的关闭有自动退出,并清理自身对象
    */

    /*
     CAfxThread myThread;
     myThread.CreateThread();
     //这样是不行的...
    */
    }

  • 相关阅读:
    解方程
    十进制快速幂
    comb
    题单解题记录-POJ题目分类推荐 (很好很有层次感)
    算法题离谱错误合集
    VMware-Ubuntu16.04踩坑解决记录
    2020牛客多校赛第三场
    需学习的博客地址
    错误记录
    可持久化线段树 区间第k大/小
  • 原文地址:https://www.cnblogs.com/tianlangshu/p/1989560.html
Copyright © 2011-2022 走看看