ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:39.79KB ,
资源ID:6690109      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-6690109.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC的状态.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

MFC的状态.docx

1、MFC的状态9. MFC的状态 MFC定义了多种状态信息,这里要介绍的是模块状态、进程状态、线程状态。这些状态可以组合在一起,例如MFC句柄映射就是模块和线程局部有效的,属于模块-线程状态的一部分。1. 模块状态 这里模块的含义是:一个可执行的程序或者一个使用MFC DLL的DLL,比如一个OLE控件就是一个模块。一个应用程序的每一个模块都有一个状态,模块状态包括这样一些信息:用来加载资源的 Windows实例句柄、指向当前CWinApp或者CWinThread对象的指针、OLE模块的引用计数、Windows对象与相应的MFC对象之间的映射。只有单一模块的应用程序的状态如图9-1所示。m_pM

2、oduleState 指针是线程对象的成员变量,指向当前模块状态信息(一个AFX_MODULE_STATE结构变量)。当程序运行进入某个特定的模块时,必须保证当前使用的模块状态是有效的模块状态是这个特定模块的模块状态。所以,每个线程对象都有一个指针指向有效的模块状态,每当进入某个模块时都要使它指向有效模块状态,这对维护应用程序全局状态和每个模块状态的完整性来说是非常重要的。为了作到这一点,每个模块的所有入口点有责任实现模块状态的切换。模块的入口点包括:DLL的输出函数;OLE/COM界面的成员函数;窗口过程。在讲述窗口过程和动态链接到MFC DLL的规则DLL时,曾提到了语句AFX_MANAG

3、E_STATE(AfxGetStaticModuleState( ),它就是用来在入口点切换模块状态的。其实现机制将在后面9.4.1节讲解。多个模块状态之间切换的示意图如图9-2所示。图9-2中,m_pModuleState总是指向当前模块的状态。2. 模块、进程和线程状态的数据结构 MFC定义了一系列类或者结构,通过它们来实现状态信息的管理。这一节将描述它们的关系,并逐一解释它们的数据结构、成员函数等。1. 层次关系 图9-3显示了线程状态、模块状态、线程-模块状态等几个类的层次关系:线程状态用类_AFX_THREAD_STATE描述,模块状态用类AFX_MODULE_STATE描述,模块-

4、线程状态用类AFX_MODULE_THREAD_STATE描述。这些类从类CNoTrackObject派生。进程状态类用_AFX_BASE_MODULE_STATE描述,从模块状态类AFX_MODULE_STATE派生。进程状态是了一个可以独立执行的MFC应用程序的模块状态。还有其他状态如DLL的模块状态等也从模块状态类_AFX_MODULE_STATE派生。图9-4显示了这几个类的交互关系。从图9-4可以看出:首先,每个线程有一个线程状态,线程状态的指针m_pModuleState和m_pPreModuleState分别指向线程当前运行模块的状态或前一运行模块的状态;其次,每一个模块状态都有

5、一个线程局部的变量用来存储模块-线程状态。下面各小节列出状态信息管理所涉及的各个类的定义。2. CNoTrackObject类 在图9-3中, CnoTrackObject是根类,所有状态类都是从它这里派生的,其定义如下:class CNoTrackObjectpublic:void* PASCAL operator new(size_t nSize);void PASCAL operator delete(void*);#if defined(_DEBUG) & !defined(_AFX_NO_DEBUG_CRT)void* PASCAL operator new(size_t nSize

6、, LPCSTR, int);#endifvirtual CNoTrackObject() ;该类的析构函数是虚拟函数;而且,CNoTrackObject重载new操作符用来分配内存,重载delete操作符号用来释放内存,内部通过LocalAlloc/LocalFree提供了一个低层内存分配器(Low_level alloctor)。3. AFX_MODULE_STATE类 AFX_MODULE_STATE类的定义如下:/ AFX_MODULE_STATE (global data for a module)class AFX_MODULE_STATE : public CNoTrackObj

7、ectpublic:#ifdef _AFXDLLAFX_MODULE_STATE(BOOL bDLL,WNDPROC pfnAfxWndProc,DWORD dwVersion);AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc, DWORD dwVersion,BOOL bSystem);#elseAFX_MODULE_STATE(BOOL bDLL);#endifAFX_MODULE_STATE();CWinApp* m_pCurrentWinApp;HINSTANCE m_hCurrentInstanceHandle;HINSTANCE

8、m_hCurrentResourceHandle;LPCTSTR m_lpszCurrentAppName;BYTE m_bDLL;/ TRUE if module is a DLL, FALSE if it is an EXE/TRUE if module is a system module, FALSE if notBYTE m_bSystem;BYTE m_bReserved2; / padding/Runtime class data:#ifdef _AFXDLLCRuntimeClass* m_pClassInit;#endifCTypedSimpleList m_classLis

9、t;/ OLE object factories#ifndef _AFX_NO_OLE_SUPPORT#ifdef _AFXDLLCOleObjectFactory* m_pFactoryInit;#endifCTypedSimpleList m_factoryList;#endif/ number of locked OLE objectslong m_nObjectCount;BOOL m_bUserCtrl;/ AfxRegisterClass and AfxRegisterWndClass dataTCHAR m_szUnregisterList4096;#ifdef _AFXDLLW

10、NDPROC m_pfnAfxWndProc;DWORD m_dwVersion; / version that module linked against#endif/ variables related to a given process in a module/ (used to be AFX_MODULE_PROCESS_STATE)#ifdef _AFX_OLD_EXCEPTIONS/ exceptionsAFX_TERM_PROC m_pfnTerminate;#endifvoid (PASCAL *m_pfnFilterToolTipMessage)(MSG*, CWnd*);

11、#ifdef _AFXDLL/ CDynLinkLibrary objects (for resource chain)CTypedSimpleList m_libraryList;/ special case for MFCxxLOC.DLL (localized MFC resources)HINSTANCE m_appLangDLL;#endif#ifndef _AFX_NO_OCC_SUPPORT/ OLE control container managerCOccManager* m_pOccManager;/ locked OLE controlsCTypedSimpleList

12、m_lockList;#endif#ifndef _AFX_NO_DAO_SUPPORT_AFX_DAO_STATE* m_pDaoState;#endif#ifndef _AFX_NO_OLE_SUPPORT/ Type library cachesCTypeLibCache m_typeLibCache;CMapPtrToPtr* m_pTypeLibCacheMap;#endif/ define thread local portions of module stateTHREAD_LOCAL(AFX_MODULE_THREAD_STATE, m_thread);从上面的定义可以看出,模

13、块状态信息分为如下几类:模块信息,资源信息,对动态链接到MFC DLL的支持信息,对扩展DLL的支持信息,对DAO的支持信息,对OLE的支持信息,模块-线程状态信息。模块信息包括实例句柄、资源句柄、应用程序名称、指向应用程序的指针、是否为DLL模块、模块注册的窗口类,等等。其中,成员变量m_fRegisteredClasses、m_szUnregisterList曾经在讨论MFC的窗口注册时提到过它们的用处。在“#ifdef _AFXDLL#endif”条件编译范围内的是支持MFC DLL的数据;在“#ifndef _AFX_NO_OLE_SUPPOR#endif”条件编译范围内的是支持OLE

14、的数据;在“#ifndef _AFX_NO_OCC_SUPPOR#endif”条件编译范围内的是支持OLE控件的数据;在“#ifndef _AFX_NO_DAO_SUPPORT”条件编译范围内的是支持DAO的数据。THREAD_LOCAL宏定义了线程私有的模块-线程类型的变量m_thread。4. _AFX_BASE_MODULE_STATE 该类定义如下:class _AFX_BASE_MODULE_STATE : public AFX_MODULE_STATEpublic:#ifdef _AFXDLL_AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(T

15、RUE,AfxWndProcBase, _MFC_VER)#else_AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(TRUE)#endif ;由定义可见,该类没有在_AFX_MODULE_STATE类的基础上增加数据。它类用来实现一个MFC应用程序模块的状态信息。5. _AFX_THREAD_STATE 该类定义如下:class _AFX_THREAD_STATE : public CNoTrackObjectpublic:_AFX_THREAD_STATE();virtual _AFX_THREAD_STATE();/ override for m_p

16、ModuleState in _AFX_APP_STATEAFX_MODULE_STATE* m_pModuleState;AFX_MODULE_STATE* m_pPrevModuleState;/ memory safety pool for temp mapsvoid* m_pSafetyPoolBuffer; / current buffer/ thread local exception contextAFX_EXCEPTION_CONTEXT m_exceptionContext;/ CWnd create, gray dialog hook, and other hook dat

17、aCWnd* m_pWndInit;CWnd* m_pAlternateWndInit; / special case commdlg hookingDWORD m_dwPropStyle;DWORD m_dwPropExStyle;HWND m_hWndInit;BOOL m_bDlgCreate;HHOOK m_hHookOldCbtFilter;HHOOK m_hHookOldMsgFilter;/ other CWnd modal dataMSG m_lastSentMsg; / see CWnd:WindowProcHWND m_hTrackingWindow; / see CWnd

18、:TrackPopupMenuHMENU m_hTrackingMenu;TCHAR m_szTempClassName96; / see AfxRegisterWndClassHWND m_hLockoutNotifyWindow; / see CWnd:OnCommandBOOL m_bInMsgFilter;/ other framework modal dataCView* m_pRoutingView; / see CCmdTarget:GetRoutingViewCFrameWnd*m_pRoutingFrame;/see CmdTarget:GetRoutingFrame/ MF

19、C/DB thread-local dataBOOL m_bWaitForDataSource;/ common controls thread stateCToolTipCtrl* m_pToolTip;CWnd* m_pLastHit; / last window to own tooltipint m_nLastHit; / last hittest codeTOOLINFO m_lastInfo; / last TOOLINFO structureint m_nLastStatus; / last flyby status messageCControlBar* m_pLastStat

20、us; / last flyby status control bar/ OLE control thread-local dataCWnd* m_pWndPark; / parking space windowlong m_nCtrlRef; / reference count on parking windowBOOL m_bNeedTerm; / TRUE if OleUninitialize needs to be called;从定义可以看出,线程状态的成员数据分如下几类:指向模块状态信息的指针,支持本线程的窗口创建的变量,MFC命令和消息处理用到的信息,处理工具条提示信息(tool

21、tip)的结构,和处理OLE相关的变量,等等。6. AFX_MODULE_THREAD_STATE 该类定义如下:/ AFX_MODULE_THREAD_STATE (local to thread *and* module)class AFX_MODULE_THREAD_STATE : public CNoTrackObjectpublic:AFX_MODULE_THREAD_STATE();virtual AFX_MODULE_THREAD_STATE();/ current CWinThread pointerCWinThread* m_pCurrentWinThread;/ list

22、of CFrameWnd objects for threadCTypedSimpleList m_frameList;/ temporary/permanent map stateDWORD m_nTempMapLock; / if not 0, temp maps lockedCHandleMap* m_pmapHWND;CHandleMap* m_pmapHMENU;CHandleMap* m_pmapHDC;CHandleMap* m_pmapHGDIOBJ;CHandleMap* m_pmapHimageLIST;/ thread-local MFC new handler (sep

23、arate from C-runtime)_PNH m_pfnNewHandler;#ifndef _AFX_NO_SOCKET_SUPPORT/ WinSock specific thread stateHWND m_hSocketWindow;CMapPtrToPtr m_mapSocketHandle;CMapPtrToPtr m_mapDeadSockets;CPtrList m_listSocketNotifications;#endif;模块-线程状态的数据成员主要有:指向当前线程对象(CWinThread对象)的指针m_pCurrentWinThread;当前线程的框架窗口对象(

24、CFrameWnd对象)列表m_frameList(边框窗口在创建时(见图5-8)把自身添加到m-frameList中,销毁时则删除掉,通过列表m_frameList可以遍历模块所有的边框窗口);new操作的例外处理函数m_pfnNewHandler;临时映射锁定标识m_nTempMapLock,防止并发修改临时映射。系列Windows对象-MFC对象的映射,如m_pmapHWND等。这些数据成员都是线程和模块私有的。下一节讨论MFC如何通过上述这些类来实现其状态的管理。3. 线程局部存储机制和状态的实现 MFC实现线程、模块或者线程-模块私有状态的基础是MFC的线程局部存储机制。MFC定义了

25、CThreadSlotData类型的全局变量_afxThreadData来为进程的线程分配线程局部存储空间:CThreadSlotData* _afxThreadData;在此基础上,MFC定义了变量_afxThreadState来管理线程状态,定义了变量_afxBaseModuleState来管理进程状态。THREAD_LOCAL(_AFX_THREAD_STATE, _afxThreadState)PROCESS_LOCAL(_AFX_BASE_MODULE_STATE, _afxBaseModuleState)对于每个THREAD_LOCAL宏定义的变量,进程的每个线程都有自己独立的拷贝

26、,这个变量在不同的线程里头可以有不同的取值。对于每个PROCESS_LOCAL宏定义的变量,每个进程都有自己独立的拷贝,这个变量在不同的进程里头可以有不同的取值。分别解释这三个变量。1. CThreadSlotData和_afxThreadData 1. CThreadSlotData的定义 以Win32线程局部存储机制为基础,MFC设计了类CThreadSlotData来提供管理线程局部存储的功能,MFC应用程序使用该类的对象全局变量_afxThreadData来管理本进程的线程局部存储。CThreadSlotData类的定义如下:class CThreadSlotDatapublic:CT

27、hreadSlotData();/Operationsint AllocSlot();void FreeSlot(int nSlot);void* GetValue(int nSlot);void SetValue(int nSlot, void* pValue);/ delete all values in process/threadvoid DeleteValues(HINSTANCE hInst, BOOL bAll = FALSE);/ assign instance handle to just constructed slotsvoid AssignInstance(HINSTA

28、NCE hInst);/ ImplementationDWORD m_tlsIndex;/ used to access system thread-local storageint m_nAlloc; / number of slots allocated (in UINTs)int m_nRover; / (optimization) for quick finding of free slotsint m_nMax; / size of slot table below (in bits)CSlotData* m_pSlotData; / state of each slot (allo

29、cated or not)/list of CThreadData structuresCTypedSimpleList m_list; CRITICAL_SECTION m_sect;/ special version for threads only!void* GetThreadValue(int nSlot);void* PASCAL operator new(size_t, void* p) return p; void DeleteValues(CThreadData* pData, HINSTANCE hInst);CThreadSlotData();通过TLS索引m_tlsIn

30、dex,CThreadSlotData对象(_afxThreadData)为每一个线程分配一个线程私有的存储空间并管理该空间。它把这个空间划分为若干个槽,每个槽放一个线程私有的数据指针,这样每个线程就可以存放任意个线程私有的数据指针。2. CThreadSlotData的一些数据成员 在CThreadSlotData类的定义中所涉及的类或者结构定义如下:(1)m_sectm_sect是一个关键段变量,在_afxThreadData创建时初始化。因为_afxThreadData是一个全局变量,所以必须通过m_sect来同步多个线程对该变量的并发访问。(2)m_nAlloc和m_pSlotDatam_nAlloc表示已经分配槽的数目,它代表了线程局部变量的个数。每一个线程局部变量都对应一个槽,每个槽对应一个线程局部变量。槽使用CSlotData类来管理。CSlotData的定义如下:struct CSlotDataDWORD dwFlags; / slot flags (allocated/not allocated)HINSTANCE hInst; / module which owns this slot;该结构用来描述槽的使用:域dwFlags表示槽的状态,即被占用或者没有;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2