• 用户界面线程AfxBeginThread的使用


    原文链接地址:http://blog.csdn.net/akof1314/article/details/5762027

    用户界面线程在运行时会有一个窗口界面和与其相对应的窗口函数,所以它可以通过响应消息来和用户进行交互。

    AfxBeginThread 函数原型如下:

    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 
    );

    用户界面线程必须包含有消息循环,以便可以处理用户消息。要使用用户界面线程,必须派生自CWinThread 类一个线程类,而且一般要重写类的InitInstance ()和ExitInstance ()函数。

    示例:编写一个应用程序,当用户在程序主窗口按下鼠标左键时,会启动一个用户界面线程。当用户在线程窗口界面按下鼠标左键时,会弹出一个信息框。
    1.新建单文档程序;
    2.单击菜单栏“项目”→“添加类”→“MFC类”,基类选择“CWinThread ",类名输入CMyThread,点”完成“,同时以类似步骤以CFrameWnd类为基类派生CMyWnd 类;
    3.在视图类实现文件包含头文件:

    #include "MyThread.h"

    4.在CMyThread类实现文件中包含头文件:

    #include "MyWnd.h"

    5.在CMyThread::InitInstance()中创建线程中的窗体:

    BOOL CMyThread::InitInstance() 
    { 
        CMyWnd *pFrameWnd = new  CMyWnd(); 
        pFrameWnd->Create(NULL, _T("Thread Windows" )); 
        pFrameWnd->ShowWindow(SW_SHOW); 
        pFrameWnd->UpdateWindow(); 
    return  TRUE; 
    }

    6.在CMyWnd类中修改构造函数CMyWnd() 为public 属性,然后实现鼠标左键消息响应函数:

    void  CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) 
    { 
        LPTSTR pMessage = _T("This is a window thread" ); 
        CWnd *pMainWnd = AfxGetMainWnd(); 
        ::MessageBox(NULL, pMessage, _T("Thread Message" , MB_OK));
        CFrameWnd::OnLButtonDown(nFlags, point); 
    }

    7.在应用程序视图类中实现鼠标左键响应函数:

    void  CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 
    { 
        AfxBeginThread(RUNTIME_CLASS(CMyThread)); 
        CView::OnLButtonDown(nFlags, point); 
    }

    程序运行结果:

    这里要注意的是,这个用户界面不是属于主框架窗口的,可以说是和主线程窗口并列的。通过查看桌面任务栏就可以发现,两个窗口并行着显示,而且互相不影响。注意上面给出的代码MessageBox 是引用API的,并且是无窗口,所以这里有三个并行的窗口,而且各不干扰。单独关闭用户界面线程的窗体,可以正常退出用户界面线程。但是如果直接关闭了主线程窗体,那么用户界面线程就会非法关闭,造成内存泄露。

    对于用户界面线程的正常退出,只要在用户界面线程内调用PostQuitMessage 即可,参数为0的话,代表成功完成。

  • 相关阅读:
    Blur Detection using OpenCV (Laplacian and FFT based approach)
    iBlurDetect: Image Blur Detection Techniques Assessment and Evaluation Study
    Cassandra
    ClickHouse
    xarray 生成 tiff 文件
    PostgreSQL 安装与使用
    PostgreSql和PostGIS安装——Windows10家庭版
    python 安装geopandas
    Linux从基础到架构师学习路线 摩天居士
    10 Python编程:从入门到实践socket&socketserver 摩天居士
  • 原文地址:https://www.cnblogs.com/wuyuan2011woaini/p/5725000.html
Copyright © 2020-2023  润新知