用户界面线程AfxBeginThread的使用

简介: 用户界面线程在运行时会有一个窗口界面和与其相对应的窗口函数,所以它可以通过响应消息来和用户进行交互。 AfxBeginThread 函数原型如下: CWinThread *AfxBeginThread(     CRuntimeClass *pThreadClass,         //从CW...

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

AfxBeginThread 函数原型如下:

CWinThread *AfxBeginThread( 
    CRuntimeClass *pThreadClass,          //从CWinThread派生的RUNTIME_CLASS类   
     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的话,代表成功完成。

目录
相关文章
|
11月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
1193 100
|
8月前
|
关系型数据库 OLAP OLTP
深入剖析 OALP 与 OLTP:概念、区别、技术、场景
本文深入剖析了OLTP(在线事务处理)与OLAP(在线分析处理)的概念、区别、技术及应用场景。OLTP专注于实时业务操作,确保数据一致性和高效性,适用于金融、电商等行业;OLAP则侧重于历史数据分析,支持复杂查询和多维分析,助力企业决策。两者在数据特点、系统设计、用户类型及数据库设计上存在显著差异。合理结合OLTP和OLAP,可提升企业的运营效率和决策水平。
1228 15
|
10月前
|
人工智能 安全 Cloud Native
|
C++
C++ PCL SACSegmentationFromNormals setAxis 轴向的选择
C++ PCL SACSegmentationFromNormals setAxis 轴向的选择
222 2
|
网络协议 网络虚拟化
MPLS VPN跨域方案(一)
MPLS VPN跨域方案(一)
|
JSON JavaScript 数据格式
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
1901 2
|
人工智能 自然语言处理
Kimi Chat是什么模型?一文让你顿悟
Kimi Chat是什么模型?一文让你顿悟
578 0
|
存储 Prometheus Kubernetes
在K8S中,如何收集K8S日志?有哪些方案?
在K8S中,如何收集K8S日志?有哪些方案?
[MFC] 对话框自带滚动条的使用
[MFC] 对话框自带滚动条的使用
312 0