WEB开发网
开发学院软件开发VC MFC教程(9)-- MFC的进程和线程(2) 阅读

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

 2010-03-25 20:35:05 来源:WEB开发网   
核心提示:模块状态切换就是把当前线程的线程状态的m_pModuleState指针指向即将运行模块的模块状态,MFC使用AFX_MANAGE_STATE宏来完成模块状态的切换,MFC教程(9)-- MFC的进程和线程(2)(4),即进入模块时使用当前模板的模板状态,并保存原模板状态;退出模块时恢复原来的模块状态,继承父线程的模块状

模块状态切换就是把当前线程的线程状态的m_pModuleState指针指向即将运行模块的模块状态。

MFC使用AFX_MANAGE_STATE宏来完成模块状态的切换,即进入模块时使用当前模板的模板状态,并保存原模板状态;退出模块时恢复原来的模块状态。这相当于状态的压栈和出栈。实现原理如下。

先看MFC关于AFX_MANAGE_STATE的定义:

#ifdef _AFXDLL

struct AFX_MAINTAIN_STATE

{

AFX_MAINTAIN_STATE(AFX_MODULE_STATE* pModuleState);

~AFX_MAINTAIN_STATE();

protected:

AFX_MODULE_STATE* m_pPrevModuleState;

};

//AFX_MANAGE_STATE宏的定义:

#define AFX_MANAGE_STATE(p) AFX_MAINTAIN_STATE _ctlState(p);

#else // _AFXDLL

#define AFX_MANAGE_STATE(p)

#endif //!_AFXDLL

如果使用MFC DLL,MFC提供类AFX_MAINTAIN_STATE来实现状态的压栈和出栈,AFX_MANAGE_SATATE宏的作用是定义一个AFX_MAINTAIN_STATE类型的局部变量_ctlState。

AFX_MAINTAIN_STATE的构造函数在其成员变量m_pPrevModuleState中保存当前的模块状态对象,并把参数指定的模块状态设定为当前模块状态。所以该宏作为入口点的第一条语句就切换了模块状态。---www.bianceng.cn

在退出模块时,局部变量_ctlState将自动地销毁,这导致AFX_MAINTAIN_STATE的析构函数被调用,析构函数把保存在m_pPrevModuleState的状态设置为当前状态。

AFX_MANAGE_SATATE的参数在不同场合是不一样的,例如,

DLL的输出函数使用

AFX_MANAGE_SATATE(AfxGetStaticModuleState());

其中,AfxGetStaticModuleState返回DLL的模块状态afxModuleState。

窗口函数使用

AFX_MANAGE_STATE(_afxBaseModuleState.GetData());

其中,_afxBaseModuleState.GetData()返回的是应用程序的全局模块状态。

OLE使用的模块切换方法有所不同,这里不作讨论。

上面讨论了线程执行行不同模块的代码时切换模块状态的情况。在线程创建时怎么处理模块状态呢?

一个进程(使用MFC的应用程序)的主线程创建线程模块状态和进程模块状态,前者是_AFX_THREAD_STATE类的实例,后者是_AFX_BASE_MODULE_STATE类的实例。

当进程的新的线程被创建时,它创建自己的线程状态,继承父线程的模块状态。在线程的入口函数_AfxThreadEntry完成这样的处理,该函数的描述见8.5.3节。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:MFC 教程 MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接