开始一个新线程为什么要用_beginThreadex()?而不用AfxBeginThread(),区别何在?
看到下面这段代码,是个宏,为什么不用AfxBeginThread()代替宏中的那个开始线呈的函数:_beginthreadex()??
#define BeginThread(pfnStartAddr,pvParam,pdwThreadID)\
((HANDLE)(_beginthreadex((void*)NULL,\
0,\
(PTHREAD_START)(pfnStartAddr),\
(void*)(pvParam),\
0,\
(unsigned*)(pdwThreadID)\
)\
)\
)
问题点数:60、回复次数:5Top
1 楼huanyun(无妻徒刑)回复于 2003-11-01 20:51:54 得分 15
AfxBeginThread()是MFC的线程函数
_beginthreadex()是C库函数
AfxBeginThread()有MFC提供的一些方便的控制 安全性较_beginthreadex()高
但系统开销比_beginthreadex()大Top
2 楼vcforever(累)回复于 2003-11-01 21:14:55 得分 30
1、不要在一个MFC程序中使用_beginthreadex()或CreateThread()。
这句话的意思是由于AfxBeginThread()是MFC封装的启动线程的函数,里面包含了很多和MFC相关的启动信息,而且封装了一些常用的操作,使用起来也比较简便。而用另外两个函数就需要程序员对类型,安全性检查进行更多的思考!
2、用_beginthreadex()函数应该是最佳选择,因为_beginthreadex()函数是C Run-time Library 中的函数,函数的参数和数据类型都是C Run-time Library中的类型,这样在启动线程时就不需要进行Windows数据类型和C Run-time Library中的数据类型之间的转化。减低了线程启动时的资源消耗和时间的消耗!
3、在C++程序中,几乎都要用到new和delete,难道只有使用_beginthreadex()?
不,因为MFC也是C++类库(只不过是Microsoft的C++类库,不是标准的C++类库),在MFC中也封装了new和delete两中运算符,所以用到new和delete的地方不一定非要使用_beginthreadex() 函数,用其他两个函数都可以!
其实在程序中使用上面的哪个函数并不是绝对的,书的作者只不过是提了一个更佳的搭配方法,我在
MFC程序中也经常使用_beginthreadex()和CreateThread()这两个函数,运行的效果也没有多大的区别,有的时候只是需要你额外的进行一些类型检查和其他的一些转化操作,其余没有其他不妥!
上面是俺的一些理解,和在工作中的一点感觉!
希望对你有所帮助!
Top
3 楼cmsbai(小白)回复于 2003-11-01 21:22:59 得分 0
同感Top
4 楼reviver(reviver)回复于 2003-11-02 22:00:45 得分 15
补充一点,_beginthreadex()是针对CRT的线程函数,在线程中若要用到CRT的函数,最好用这个启动线程,如果不用这个会有内存泄漏。Top
5 楼chenqsbeast(斗战圣佛)回复于 2003-11-03 16:55:30 得分 0
有道理Top




