您现在的位置:中国下载站学院中心网络编程Visual C++教程Visual C++入门教程 → 文章列表

MFC教程(9)-- MFC的进程和线程(1)

作者:佚名  来源:不详  发布时间:2007-3-27 17:34:40   

减小字体 增大字体

 
 

  MFC定义了多种状态信息,这里要介绍的是模块状态、进程状态、线程状态。这些状态可以组合在一起,例如MFC句柄映射就是模块和线程局部有效的,属于模块-线程状态的一部分。

  模块状态

  这里模块的含义是:一个可执行的程序或者一个使用MFC DLL的DLL,比如一个OLE控件就是一个模块

  一个应用程序的每一个模块都有一个状态,模块状态包括这样一些信息:用来加载资源Windows实例句柄、指向当前CWinApp或者CWinThread对象的指针、OLE模块的引用计数、Windows对象与相应的MFC对象之间的映射。只有单一模块的应用程序的状态如图9-1所示。

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

  在讲述窗口过程和动态链接到MFC DLL的规则DLL时,曾提到了语句AFX_MANAGE_STATE(AfxGetStaticModuleState( )),它就是用来在入口点切换模块状态的。其实现机制将在后面9.4.1节讲解。

[责任编辑:cndownzcom]

  多个模块状态之间切换的示意图如图9-2所示。

  图9-2中,m_pModuleState总是指向当前模块的状态。

  模块、进程和线程状态的数据结构

  MFC定义了一系列类或者结构,通过它们来实现状态信息的管理。这一节将描述它们的关系,并逐一解释它们的数据结构、成员函数等。

  层次关系

  图9-3显示了线程状态、模块状态、线程-模块状态等几个类的层次关系:

  线程状态用类_AFX_THREAD_STATE描述,模块状态用类AFX_MODULE_STATE描述,模块-线程状态用类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分别指向线程当前运行模块的状态或前一运行模块的状态;其次,每一个模块状态都有一个线程局部的变量用来存储模块-线程状态。

  下面各小节列出状态信息管理所涉及的各个类的定义。

  CNoTrackObject类

  在图9-3中, CnoTrackObject是根类,所有状态类都是从它这里派生的,其定义如下:

[责任编辑:cndownzcom]

  class CNoTrackObject

  {

  public:

  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, LPCSTR, int);

  #endif

  virtual ~CNoTrackObject() { }

  };

  该类的析构函数是虚拟函数;而且,CNoTrackObject重载new操作符用来分配内存,重载delete操作符号用来释放内存,内部通过LocalAlloc/LocalFree提供了一个低层内存分配器(Low_level alloctor)。

  AFX_MODULE_STATE类

  AFX_MODULE_STATE类的定义如下:

  // AFX_MODULE_STATE (global data for a module)

  class AFX_MODULE_STATE : public CNoTrackObject

  {

  public:

  #ifdef _AFXDLL

  AFX_MODULE_STATE(BOOL bDLL,WNDPROC pfnAfxWndProc,

  DWORD dwVersion);

  AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc,

  DWORD dwVersion,BOOL bSystem);

  #else

  AFX_MODULE_STATE(BOOL bDLL);

  #endif

  ~AFX_MODULE_STATE();

  CWinApp* m_pCurrentWinApp;

  HINSTANCE m_hCurrentInstanceHandle;

  HINSTANCE 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 not

  BYTE m_bSystem;

  BYTE m_bReserved[2]; // padding

  //Runtime class data:

  #ifdef _AFXDLL

  CRuntimeClass* m_pClassInit;

  #endif

  CTypedSimpleList<CRuntimeClass*> m_classList;

  // OLE object factories

  #ifndef _AFX_NO_OLE_SUPPORT

  #ifdef _AFXDLL

  COleObjectFactory* m_pFactoryInit;

  #endif

  CTypedSimpleList<COleObjectFactory*> m_factoryList;

  #endif

  // number of locked OLE objects

  long m_nObjectCount;

  BOOL m_bUserCtrl;

  // AfxRegisterClass and AfxRegisterWndClass data

  TCHAR m_szUnregisterList[4096];

  #ifdef _AFXDLL

  WNDPROC m_pfnAfxWndProc;

  DWORD m_dwVersion; // version that module linked against

  #endif

[责任编辑:cndownzcom]

  // variables related to a given process in a module

  // (used to be AFX_MODULE_PROCESS_STATE)

  #ifdef _AFX_OLD_EXCEPTIONS

  // exceptions

  AFX_TERM_PROC m_pfnTerminate;

  #endif

  void (PASCAL *m_pfnFilterToolTipMessage)(MSG*, CWnd*);

  #ifdef _AFXDLL

  // CDynLinkLibrary objects (for resource chain)

  CTypedSimpleList<CDynLinkLibrary*> m_libraryList;

  // special case for MFCxxLOC.DLL (localized MFC resources)

  HINSTANCE m_appLangDLL;

  #endif

  #ifndef _AFX_NO_OCC_SUPPORT

  // OLE control container manager

  COccManager* m_pOccManager;

  // locked OLE controls

  CTypedSimpleList<COleControlLock*> m_lockList;

  #endif

  #ifndef _AFX_NO_DAO_SUPPORT

  _AFX_DAO_STATE* m_pDaoState;

  #endif

  #ifndef _AFX_NO_OLE_SUPPORT

  // Type library caches

  CTypeLibCache m_typeLibCache;

  CMapPtrToPtr* m_pTypeLibCacheMap;

  #endif

  // define thread local portions of module state

  THREAD_LOCAL(AFX_MODULE_THREAD_STATE, m_thread)

  };

  从上面的定义可以看出,模块状态信息分为如下几类:

  模块信息,资源信息,对动态链接到MFC DLL的支持信息,对扩展DLL的支持信息,对DAO的支持信息,对OLE的支持信息,模块-线程状态信息。

  模块信息包括实例句柄、资源句柄、应用程序名称、指向应用程序的指针、是否为DLL模块、模块注册的窗口类,等等。其中,成员变量m_fRegisteredClasses、m_szUnregisterList曾经在讨论MFC的窗口注册时提到过它们的用处。

  在“#ifdef _AFXDLL…#endif”条件编译范围内的是支持MFC DLL的数据;

  在“#ifndef _AFX_NO_OLE_SUPPOR…#endif”条件编译范围内的是支持OLE的数据;

  在“#ifndef _AFX_NO_OCC_SUPPOR…#endif”条件编译范围内的是支持OLE控件的数据;

  在“#ifndef _AFX_NO_DAO_SUPPORT”条件编译范围内的是支持DAO的数据。

  THREAD_LOCAL宏定义了线程私有的模块-线程类型的变量m_thread。

  _AFX_BASE_MODULE_STATE

  该类定义如下:

  class _AFX_BASE_MODULE_STATE : public AFX_MODULE_STATE

[责任编辑:cndownzcom]

  {

  public:

  #ifdef _AFXDLL

  _AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(TRUE,

  AfxWndProcBase, _MFC_VER)

  #else

  _AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(TRUE)

  #endif

  { }

  };

  由定义可见,该类没有在_AFX_MODULE_STATE类的基础上增加数据。它类用来实现一个MFC应用程序模块的状态信


在百度中搜索更多MFC教程(9)-- MFC的进程和线程(1)相关网页 转贴于:中国下载站

  • 上一篇文章:MFC教程(9)-- MFC的进程和线程(2)
  • 下一篇文章:偷偷看到酒店服务小姐后台换工作服(全过程)
  • 阅读统计:[]
  • 中国下载站】【设为主页】【收藏本页】【打印本文】【回到顶部】【关闭此页

    相关文章
    文章评论(评论内容只代表网友观点,与本站立场无关!)

    用户名: 查看更多评论

    分 值:100分 85分 70分 55分 40分 25分 10分 0分

    内 容:

             (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码


    设为首页 - 关于我们 - 广告服务 - 网站地图 - 加入收藏 - 网站声明 - 网站帮助 - 友情链接

    • Copyright (C) 2006-2008 www.cndownz.com All Rights Reserved.
      中国下载站 版权所有. 粤ICP备05141802号. 对本站有任何建议、意见或投诉,请来信:cndownzcom@yahoo.com.cn.
      喜欢中国下载站(cndownz.com),请把中国下载站(cndownz.com)告诉你QQ上的5位好友,多谢支持!