深度解析MFC线程及机制

原创 2003年10月27日 02:06:00

在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流程

AfxBeginThread流程

_AfxThreadEntry流程

_AfxThreadEntry流程

希望对大家有用!

版权声明:本文为博主原创文章,未经博主允许不得转载。

MFC初始化过程

MFC应用程序不但具有一般的Win32程序的主要入口WinMain函数,还有一个CWinApp派生类的全局实例 theApp。 Mfc程序(EXE)的程序运行过程如下: 首先是全局构造 CObject...
  • solotony
  • solotony
  • 2004年07月17日 16:00
  • 8863

AfxBeginThread引起的内存泄漏

AfxBeginThread引起的内存泄漏(ZZ) 下面的代码,当用AfxBeginThread开始一个线程时,实际上是有内存泄漏的 for  (ii  =   0 ; ii  { ...
  • cosmoslife
  • cosmoslife
  • 2013年03月23日 11:09
  • 765

mfc 线程与进程

进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。一个应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程。 ...
  • chenmeng19850123
  • chenmeng19850123
  • 2014年04月28日 18:54
  • 383

<MFC笔记> 四种线程同步(或互斥)方式小结

一,什么是线程同步? 同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。这里的同步千万不要理解成那个同时进行,应是指协同、协助、互相配合。 线程同步是指多线程通过特定的设置(如互斥量,...
  • EbowTang
  • EbowTang
  • 2014年06月10日 21:35
  • 2121

MFC多线程各种线程用法 .

一、问题的提出      编写一个耗时的单线程程序:        新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,...
  • shenya1314
  • shenya1314
  • 2017年02月08日 11:13
  • 1987

MFC线程(一):简单介绍

线程简介 我们知道一般情况程序中的代码都是按顺序从头开始一行一行的执行以最后.中间不能出现同时执行的情况.比如一段代码调用两个函数 FunOne(); FunTwo(); 只要当函数FunOn...
  • weiwenhp
  • weiwenhp
  • 2013年03月08日 14:13
  • 25974

深度解析MFC线程及机制

 在VC中,启动一线程有3种方式:1.使用MFC中启动一个线程一般使用AfxBeginThread函数;2.使用API则使用CreateThread;3.就是使用_beginthread和_begin...
  • pizi0475
  • pizi0475
  • 2010年02月25日 10:46
  • 504

JVM_Java垃圾处理机制

一:如何确定对象已死? 1.1引用计数法 引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象实例都有一个引用计数。当一个对象被创建时,且将该对象实例分配给一个变量,该变量计数设置为1。当...
  • hhgggggg
  • hhgggggg
  • 2017年08月23日 20:01
  • 136

MFC 多线程间通信

 AfxBeginThead全局变量参数传递消息传递线程通信 目录(?)[-] 线程间的通信 线程之间的通信简介全局变量方式参数传递方式消息传递方式线程同步法 ...
  • qq61394323
  • qq61394323
  • 2014年05月08日 19:40
  • 11988

MFC多线程各种线程用法 .

一、问题的提出 编写一个耗时的单线程程序:   新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为 IDC_...
  • qq61394323
  • qq61394323
  • 2013年07月15日 09:08
  • 34085
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度解析MFC线程及机制
举报原因:
原因补充:

(最多只允许输入30个字)