欢迎来到天天文库
浏览记录
ID:37854462
大小:70.00 KB
页数:12页
时间:2019-06-01
《MFC中的多线程问题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、3多线程的调度和处理 在32位Windows环境下,开发多线程应用程序可以利用提供的Win32API接口函数,也可以利用VC++中提供的MFC类库进行开发。两种方式对于多线程编程原理是一样的,用户可以根据需要选择相应的工具。下面以利用MFC类库实现多线程调度与处理为例,介绍多线程的实现方法以及多个线程间任务调度所应注意的一些关键技术。 3.1基于MFC的多线程设计 在VC++6.0环境下,MFC类库提供了对多线程编程支持,使得多线程能方便的实现。MFC区分两种类型的线程:辅助线程(WorkerThread)和用户
2、界面线程(UserInterfaceThread)。辅助线程没有消息机制,通常用来执行后台计算和维护任务。MFC为用户界面线程提供消息机制,用来处理用户的输入,响应用户产生的事件和消息。但对于Win32的API来说,这两种线程并没有区别,它只需要线程的启动地址以便启动线程执行任务。用户界面线程的一个典型应用就是类CWinApp,类CwinApp是CWinThread类的派生类,应用程序的主线程是由它提供,并由它负责处理用户产生的事件和消息。 类CwinThread是用户接口线程的基本类。CWinThread的对象用以
3、维护特定线程的局部数据。因为处理线程局部数据依赖于类CWinThread,所以所有使用MFC的线程都必须由MFC来创建。 3.2多线程的创建及涉及的关键问题 要创建一个线程,需要调用函数AfxBeginThread。该函数通过参数重载可以实现辅助线程和用户界面线程的创建。但不论是辅助线程还是用户界面线程,都需要指定额外的参数以修改优先级,堆栈大小,创建标志和安全特性等。函数AfxBeginThread返回指向CWinThread类对象的指针。创建助手线程相对简单,并不必须从CWinThread派生一个类。实现起来需
4、要两步:实现控制函数和启动线程。 实现控制函数,定义线程。当进入该函数,线程启动;退出时,线程终止。该控制函数声明如下:UINTMyControllingFunction(LPVOIDpParam); 该参数是一个单精度32位值。该参数接收的值将在线程对象创建时传递给构造函数。控制函数将用某种方式解释该值。可以是数量值,或是指向包括多个参数的结构的指针,甚至可以被忽略。如果该参数是指结构,则不仅可以将数据从调用函数传给线程,也可以从线程回传给调用函数。如果使用这样的结构回传数据,当结果准备好的时候,线程要通知调用函
5、数。当函数结束时,应返回一个UINT类型的值,通常,返回0表明成功,其它值则代表不同的错误。 控制函数建立后,接着就可以启动线程。由函数AfxBeginThread创建并初始化一个CWinThread类的对象,启动并返回该线程的地址,此时线程进入运行状态。下面是一个控制函数及其使用的实例代码。UINTMyThreadProc(LPVOIDpParam){CMyObject*pObject=(CMyObject*)pParam;if(pObject==NULL
6、
7、!pObject->IsKindOf(RUNTIME_C
8、LASS(CMyObject)))return-1;//非法参数……//具体实现内容return0;//线程成功结束}//在程序中调用线程的函数……pNewObject=newCMyObject;AfxBeginThread(MyThreadProc,pNewObject);…… 对于用户界面线程的创建有两种途径:一是,首先从CWinTread类派生一个类(注意必须要用宏DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE对该类进行声明和实现),然后调用函数AfxBeginThread创建CWi
9、nThread派生类的对象进行初始化启动线程运行;二是,不调用函数AfxBeginThread,先通过构造函数创建类CWinThread的一个对象,然后由程序员调用函数::CreateThread来启动线程。通常类CWinThread的对象在该线程的生存期结束时将自动终止,如果程序员希望自己来控制,则需要将m_bAutoDelete设为FALSE。这样在线程终止之后类CWinThread对象仍然存在,只是在这种情况下需要手动删除CWinThread对象。 多线程创建后,就存在线程间优先级差异以及线程同步等问题。在Wi
10、ndows95和WindowsNT操作系统当中,每个任务都具有相应优先级,优先级共有32级,从0到31,系统按照不同的优先级调度线程的运行。其中0~15级是普通优先级,线程的优先级可以动态变化。高优先级线程优先运行,只有高优先级线程不运行时,才调度低优先级线程运行。优先级相同的线程按照时间片轮流运行;16~30级是实时优先级,实时
此文档下载收益归作者所有