在VC中,启动一线程有3种方式:

1.使用MFC中启动一个线程一般使用AfxBeginThread函数;

2.使用API则使用CreateThread;

3.就是使用_beginthread和_beginthreadex两个函数。

使用MFC的AfxBeginThread函数启动一个线程,不管你代入的参数是否是个从CWinThread继承来的线程类还是一以标准的线程函数地址及参数(UINT ThreadProc(LPVOID pParam)的形式),都返回了一CWinThread指针方便了我们使用。但其中的机理没有在哪本书上有人仔细分析过,没办法只好查看MFC源码了。经过分析,现将分析的结果与大家分享。:)

在CWinThread类中有两个构造函数:

一为默认的构造,还有一个为一标准线程函数地址和输入参数的构造函数-
CWinThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam)。当我们使用AfxBeginThread启动一个线程时,无外2种方法:
 1.直接启动已CWinThread为基类的线程类-AfxBeginThread(RUNTIME_CLASS(...),...);
 2.直接启动标准的线程函数-AfxBeginThread((AFX_THREADPROC),LPVOID ,....);

还有一种方法可能大家不常用,就是以CWinThread继承一线程类,在内存中new,然后调用CWinThread的成员函数CreateThread来启动自身;
经过我的分析,实际上第1种和第2种方法就是第3中方法的详细化,调用更加灵活,但1、2种比起来要方便些。:)
实际上AfxBeginThread根据参数实现创建一CWinThread线程:若参数为一标准的线程函数地址,则new一CWinThread对象,以函数地址及参数构造;若参数为一CWinThread继承过来的类则直接调用CRunTimeClass的CreateObject创建一CWinThread对象,以默认参数构造。然后调用CreateThread成员函数,调用不成功便调用Delete(),判断是否设置了自我删除对象(m_bAutoDelete = TRUE),为真则删除自身。

在CreateThread函数中,首先创建2个事件,MFC利用_beginthreadex启动一名为_AfxThreadEntry的全局线程函数,并通过一_AFX_THREAD_STARTUP结构体将一系列参数传入,然后等待_AfxThreadEntry将一线程初始化完毕设置事件1状态为止,然后自己设置另一个事件2状态,触发_AfxThreadEntry中的代码;在_AfxThreadEntry中,函数首先通过一系列函数初始化线程,再设置事件1状态后等待CWinThread的CreateThread执行完毕后的事件2,这时判断_AFX_THREAD_STARTUP中的线程函数地址是否为空,若不为空就直接执行函数代码;若不为空就执行CWinThread的InitInstance判断是否返回为TRUE,是的话就进入消息循环知道发送给线程WM_QUIT消息为止;若返回为FALSE,就调用ExitInstance;最后都调用AfxEndThread结束线程。而AfxEndThread则从模块中先取得CWinThread*类型的指针判断是否为NULL,否的话则调用CWinThread的Delete来将CWinThread从内存中删除。

以下是简易流程图:

AfxBeginThread:

AfxBeginThread流程

_AfxThreadEntry流程

希望对大家有用!

深度解析MFC线程及机制相关推荐

  1. 解析JVM线程同步机制

    http://blog.csdn.net/thl789/article/details/566494 对多线程的支持一般是在OS级的,而Java将其做在了语言级别,这其中最吸引人的莫过于Java对线程 ...

  2. python是不是特别垃圾-深度解析Python垃圾回收机制(超级详细)

    我们知道,目前的计算机都采用的是图灵机架构,其本质就是用一条无限长的纸带,对应今天的存储器.随后在工程学的推演中,逐渐出现了寄存器.易失性存储器(内存)以及永久性存储器(硬盘)等产品.由于不同的存储器 ...

  3. python垃圾回收价格表_深度解析Python垃圾回收机制(超级详细)

    我们知道,目前的计算机都采用的是图灵机架构,其本质就是用一条无限长的纸带,对应今天的存储器.随后在工程学的推演中,逐渐出现了寄存器.易失性存储器(内存)以及永久性存储器(硬盘)等产品.由于不同的存储器 ...

  4. 深入源码,深度解析Java 线程池的实现原理

    java 系统的运行归根到底是程序的运行,程序的运行归根到底是代码的执行,代码的执行归根到底是虚拟机的执行,虚拟机的执行其实就是操作系统的线程在执行,并且会占用一定的系统资源,如CPU.内存.磁盘.网 ...

  5. 深度解析Linux kernel同步机制(上篇)

    在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实像多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问,尤其是在多处理器系统上,更需要一些同步机制来同步不同处理器上 ...

  6. 深度解析算法优化内部机制:为什么机器学习算法难以优化?

    前言 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! MATLAB-30天带你从入门到精通 MATLAB深入理解高级教程(附源码) tableau可视化数据 ...

  7. RTOS内功修炼记(十) | 深度解析RTOS内核上下文切换机制

    一.风平浪静的程序世界 芯片上电的那一刻,犹如小船撑起了帆,开始远航. 这艘小船上,PC寄存器负责航行路线,按照路线图(可执行固件)告诉船长(CPU)接下来该往走哪个方向,船长在走的时候,还要依赖R0 ...

  8. 深度解析dubbo源码系列

    以下文章均基于dubbo v2.6.x 持续更新中- dubbo spi 扩展技术,框架基石 <深度解析dubbo扩展技术dubbo spi(注解)> <深度解析dubbo扩展技术d ...

  9. 深度解析ASP.NET2.0中的Callback机制

    callback的一般使用方法还算简单,直接参照msdn的帮助和范例就足够了.但是想要真正用好.用精,或者想开发一些基于callback机制的WEB组件,那么,就要先深入了解callback的实现机制 ...

  10. 图文深度解析Linux内存碎片整理实现机制以及源码

    图文深度解析Linux内存碎片整理实现机制以及源码. 物理内存是以页为单位进行管理的,每个内存页大小默认是4K(大页除外).申请物理内存时,一般都是按顺序分配的,但释放内存的行为是随机的.随着系统运行 ...

最新文章

  1. 想改善风险管理工作吗?做些基础性工作吧
  2. html怎么把图片放到数组,HTML5中的图像数组
  3. 安装SAP Business One对软硬件有哪些要求
  4. u-boot Makefile完全解读
  5. BZOJ 4388 [JOI2012春季合宿]Invitation (线段树、二叉堆、最小生成树)
  6. stl_alloc.h分配器
  7. win10中linux系统下载软件,win10 上安装 Debian Linux子系统
  8. HubbleDotNet开源全文搜索数据库项目--技术详解
  9. 学生管理系统分层开发
  10. java输出矩形_java输出长方形求解答
  11. 一次Mysql服务不断重启排查,原因竟然是它
  12. Android 系统开发系列二
  13. 嵌入式工具——iperf
  14. 格而知之8:我所理解的Runtime(3)
  15. VFP+6.0中文版教程--初级教程
  16. python3.6从入门到精通mobi_Python 3.6零基础入门与实战epub
  17. 服务器2008系统驱动安装,Windows Server 2008系统安装设备驱动的方法
  18. EF migration conflicted with foreign key constraint
  19. 20230105无剩余飞行时间的时间制导律:当导弹位于静止目标右侧时就打不中目标?
  20. iToo Software推出Forest Pack 6

热门文章

  1. http抓包实践--(二)--web网页抓包和fiddler修改包
  2. pwdx与netstat、lsof结合查找进程号是由哪个程序启动的
  3. java入门简单小项目_JAVA入门_java项目接入Mysql8.0
  4. python turtle输出坐标_如何在Python/turtle中使用坐标列表绘制形状
  5. python dataframe 取每行的最大值_在pandas DataFrame中查找列的值最大的行
  6. flutter 进度条_OkHttp 在 Flutter中的运用场景,Flutter语言连接网络的方法介绍
  7. 动态规划实战6 leetcode-139. Word Break
  8. java bytebuffer读取_Java NIO学习笔记之二-图解ByteBuffer
  9. 【系列二之图像处理系列】波形处理(3)
  10. 【问题10】使用Redis SETNX 命令实现分布式锁