1、生成线程
方式1、
HANDLE hthread; //线程句柄
hthread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadFunc,NULL,0,NULL);//获得句柄
CloseHandle(hthread);//如果后面不需要操作这个线程就可以把线程句柄关掉,但是线程不会被关,线程函数结束,线程才结束
方式2、
AfxBeginThread(threadFunc, this);【对CreateThread的封装】
2、线程函数
static UINT threadFunc(LPVOID pParam) //必须是静态的
{
CDialog *new_this = (CDialog*)pParam;//新指针
while(1)
{
Sleep(2000);
AfxMessageBox(_T("OK!"));
}
}
ps:常用的三种开启线程的函数
1、CreateThread
这是windows api函数,在windows上编程最后都会调用这个函数,这个函数用起来很危险,涉及进程、线程同步,内存相关的操作,不建议使用
2、AfxBeginThread
这是mfc提供的全局函数
3、_beginthread
这是调用c的函数,可以放心的使用标准C运行时库的东西
ps:入口函数只能是全局函数或者类的静态成员函数,为什么?
首先类的成员函数是能够访问类里的成员变量的,那么为什么能访问呢?是因为编译器自动为所有成员函数增加一个参数,对象的this指针。比如:
class A{ int fun(int); }; 实际上fun()是fun(int,A* this)
但是线程函数在初始化的时候,一般会向线程函数传递参数,所以参数个数是固定的,如create(fun,100),这里100就是传递的参数。然而fun是类成员函数,除了int参数还需要一个this指针,所以这里传递的参数就少了。使用全局函数和静态函数的原因就是,没有这个隐含的this指针作为参数。