C++中用AfxBeginThread创建线程

AfxBeginThread函数知识

1、AfxBeginThread的原型有两个,一个是用户界面(user-interface)线程,一个是工作者(worker)线程
用户界面线程的AfxBeginThread
用户界面线程的AfxBeginThread的原型如下:
CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,int nPriority, UINT nStackSize, DWORD dwCreateFlags,LPSECURITY_ATTRIBUTES lpSecurityAttrs)
其中:
参数1是从CWinThread派生的RUNTIME_CLASS类;
参数2指定线程优先级,如果为0,则与创建该线程的线程相同;
参数3指定线程的堆栈大小,如果为0,则与创建该线程的线程相同;
参数4是一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。
参数5表示线程的安全属性,NT下有用。

工作者线程的AfxBeginThread
工作者线程的AfxBeginThread的原型如下:
CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,int nPriority, UINT nStackSize, DWORD dwCreateFlags,LPSECURITY_ATTRIBUTES lpSecurityAttrs)
其中:
参数1 :指向工作者线程的控制函数,其值不能为空,声明方式为UINT MyControllingFunc( LPVOID pParam )。
参数2 :传入到控制函数的参数(即pfnThreadProc对应的函数),它的类型为LPVOID。
参数3:指定线程的优先级。
参数4:指定新创建线程的堆栈大小(bytes),如果为0,则默认与创建该线程的线程相同。

参数5:是一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则如果该值为0,则线程在创建后立即开始线程的执行。
参数6:指定线程的安全属性,如果该值为NULL,则与创建该线程的线程相同。NT下有用。

返回值:返回新创建的线程指针。

**

注:可以把调用线程的类的this指针作为参数传递给线程函数,如AfxBeginThread(MyControllingFunction, this),这样就可以用这个类里面的变量了。

**
如:
m_hSampThread = AfxBeginThread(AI_FiniteSampleThread, this, THREAD_PRIORITY_HIGHEST, 0, CREATE_SUSPENDED);

当我们将,CREATE_SUSPENDED传入到AfxBeginThread函数时,可以让线程在创建时处于挂起状态,他的CPU占用权交出,等待被唤醒。

也可以在运行时使用SuspendThread函数来挂起线程,然后使用ResumeThread函数来唤醒线程,值得注意的是,可以使用SupendThread多次挂起线程,线程有一个挂起计数器,初始值是0,挂起一次(含初始挂起),计数器就自增1,ResumeThread以此就自减1,当此计数器为0的时候,线程就被唤醒开始从挂起的地方开始执行。

猜你喜欢

转载自blog.csdn.net/kucoffee12/article/details/81071120
今日推荐