当前位置: 首页 > 图文教程 > 开发语言 > VC++ > VC++:小编分享线程的创建和终止

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++:小编分享线程的创建和终止


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 810 ::
收藏到网摘: n/a

接下来,小编要和大家分享的是线程的创建和终止,说的到线程先和大家说下线程到底是什么!线程,也被称为轻量进程(lightweight processes)。计算机科学术语,指运行中的程序的调度单位。线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。

  线程分用户界面线程和工作者线程两种。用户界面线程拥有自己的消息泵来处理界面消息,可以与用户进行交互。工作者线程没有消息泵,一般用来完成后台工作。

 

  MFC应用程序的线程由对象CWinThread表示。在多数情况下,程序不需要自己创建CWinThread对象。调用AfxBeginThread函数时会自动创建一个CWinThread对象。

 

 AfxBeginThread函数负责创建新线程,它的第一个参数是代表线程的函数的地址,在本例中是MyThreadProc。第二个参数是传递给线程函数的参数,这里假定线程要用到CMyObject对象,所以把pNewObject指针传给了新线程。线程函数MyThreadProc用来执行线程,请注意该函数的声明。线程函数有一个32位的pParam参数可用来接收必要的参数。

 

清单12.2 创建一个工作者线程

 

//主线程

 

pNewObject = new CMyObject;

 

AfxBeginThread(MyThreadProc, pNewObject);

 

 

 

//新线程

 

UINT MyThreadProc( LPVOID pParam )

 

{

 

CMyObject* pObject = (CMyObject*)pParam;

 

 

 

if (pObject == NULL ||

 

!pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))

 

return -1; // 非法参数

 

 

 

// pObject对象来完成某项工作

 

 

 

return 0; // 线程正常结束

 

}

 

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是线程的优先级,一般是THREAD_PRIORITY_NORMAL,若为0,则使用创建线程的优先级。nStackSize说明了线程的堆栈尺寸,若为0则堆栈尺寸与创建线程相同。dwCreateFlags指定了线程的初始状态,如果为0,那么线程在创建后立即执行,如果为CREATE_SUSPENDED,则线程在创建后就被挂起。参数lpSecurityAttrs用来说明保密属性,一般为0。函数返回新建的CWinThread对象的指针。

 

  程序应该把AfxBeginThread返回的CWinThread指针保存起来,以便对创建的线程进行控制。例如,可以调用CWinThread::SetThreadPriority来设置线程的优先级,用CWinThread::SuspendThread来挂起线程。如果线程被挂起,那么直到调用CWinThread::ResumeThread后线程才开始运行。

 

  如果要创建用户界面线程,那么必须从CWinThread派生一个新类。事实上,代表进程主线程的CWinApp类就是CWinThread的派生类。派生类必须用DECLARE_DYNCREATEIMPLEMENT_DYNCREATE宏来声明和实现。需要重写派生类的InitInstanceExitInstanceRun等函数。

 

  可以使用AfxBeginThread函数的另一个版本来创建用户界面线程。函数的声明为:

CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

 

  参数pThreadClass指向一个CRuntimeClass对象,该对象是用RUNTIME_CLASS宏从CWinThread的派生类创建的。其它参数以及函数的返回值与第一个版本的AfxBeginThread是一样的。

 

  当发生下列事件之一时,线程被终止:

 

线程调用ExitThread

 

线程函数返回,即线程隐含调用了ExitThread

 

ExitProcess被进程的任一线程显示或隐含调用。

 

线程的句柄调用TerminateThread

 

用进程句柄调用TerminateProcess

 

最后,希望小编的分享能够带给大家帮助。