14.3 多线程程序设计
在MFC中可以方便地创建线程,它把线程分为工作者线程和用户界面线程,本节对多线程的程序设计进行介绍。
14.3.1 创建线程
在MFC中,线程分为用户界面线程和工作者线程,其创建的过程有所不同,下面分别进行介绍。
1.用户界面线程的创建
在MFC中,提供了线程的功能的封装类:CWinThread类,在类向导创建的应用程序中所使用的CWinApp类就是从这个类派生出来的。在应用程序中可以使用CWinThread类来派生用户界面线程,然后调用函数启动该线程。编写用户界面线程的步骤如下:
(1)类由类向导派生一个新类,其基类为CWinThread类。
(2)创建并启动线程。可以利用下面两种方法实现创建线程并启动。
利用AfxBeginThread()函数,其函数原型如下:
- CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass, int nPriority =
- THREAD_PRIORITY_NORMAL, UINT nStackSize = 0,
- DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES
- lpSecurityAttrs = NULL );
参数pThreadClass是指定线程的运行类,函数的返回值为线程对象。
调用线程类的构造函数创建线程对象,利用CWinThread::CreateThread()函数创建该线程。
注意:需要利用构造函数创建对象,构造函数必须是公有的成员函数。
2.工作者线程
工作者线程的创建实际上就是一个函数,只需要提供该函数的地址,即线程的入口就可以了。在工作者线程启动之后就可以进入其函数,并且在函数退出时结束该线程。在MFC中可以利用AfxBeginThread()函数创建工作者线程。函数原型如下:
- CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int
- nPriority = THREAD_PRIORITY_NORMAL, UINT
- nStackSize = 0, DWORD dwCreateFlags = 0,
- LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
函数各个参数的意义为:
pfnThreadProc:函数的入口地址。
pParam:传递给线程的参数。
nPriority:表示线程的优先级。
nStackSize:表示栈的大小,为0时表示采用系统值。
dwCreateFlags:创建线程的标记。
lpSecurityAttrs:描述线程的安全属性。
函数的返回值是CWinThread类的指针,可以利用该指针实现对线程的控制。
【责任编辑:
云霞 TEL:(010)68476606】