以前很少使用MFC,今天看到一篇帖子介绍如何简单的写一个下载器的文章,自己蠢蠢欲动地想自己实现以下,结果就遇到了AFXBEGINTHREAD的使用问题。

写客户端时,里实开始只是想着在主线程现下载功能即可,就写了一个,在调试的时候想到可能在下载大文件时可能会导致界面假死的现象,就想到在前不久面试的时候经常提到的afxbeginthread函数创建一个线程专门用于文件下载,而主线程负责鼠标的响应和信息的显示而不出现卡顿的现象,使用afxbeginthread时只是想当然的以为跟使用createthread差不多,然后写完后才发现编译通不过,问题恰恰就出现在afxbeginthread的线程函数指针的传递上。查资料后得之传递给afxbeginthread线程函数指针必须为static函数或者全局函数。使用static函数不怎么合适,因为我还想在线程函数中使用其他的变量,而static函数的限制是在函数实现体中只能使用static变量。而使用全局函数自己还不会,太菜了。后来终于捣鼓出全局函数,当要在线程函数中使用变量时可以通过线程函数的形参传递。

 

要点1.afxbeginthread的线程函数必须为static函数或者全局函数

要点2.afxbeginthread与createthread的线程函数的区别: 使用前者的线程函数声明为UINT threadfun(LPVOID),后者的线程函数声明为DWORD WINAPI threadfun(LPVOID)

要点3.afxbeginthread是MFC全局函数,是对createthread的封装,createthread是winapi函数。

要点4.afxbeginthread返回CWinthread指针,会new产生一个CWinthread对象,对象会在线程运行结束后销毁,createthread返回的是一个句柄。