我爱Aspx >> VC.Net >> 深度解析MFC线程及机制深度解析MFC线程及机制
中,启动一线程有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),为真则删除自身。
【我对这篇文章有话说?】
Effective STL:Item 16:如何将..[05-21]
用户文档[05-21]
C++基本功:从一个左右值问题出发..[05-21]
Policy Tool — 策略文件创建和管..[05-21]
Effective STL: Item 21:永远让..[05-21]
获取系统当前打开的端口(tcp。u..[05-21]
实战DeviceIoControl 之六:访问..[05-21]
By value? Or by reference?[05-21]
一个计算万年历的简单程序[05-21]
一个计算万年历的简单程序[05-21]