否则,返回pData
}
SetValue
SetValue用来把调用线程的第slot个线程局部变量的值(指针)存放到线程的MFC私有存储空间的第slot个槽位。
CThreadSlotData::SetValue(int slot, void *pValue)
{
//通过TLS索引得到线程的MFC私有存储空间
pData = (CThreadData*)TlsGetValue(m_tlsIndex)
//没有得到值或者pValue非空且当前槽号,即
//线程局部变量的个数
//大于使用当前局部变量的线程个数时
if (pData NULL or slot > pData->nCount && pValue!=NULL)
{
if pData NULL //当前线程第一次访问该线程局部变量
{
创建一个CThreadData实例;
添加到CThreadSlotData::m_list;
令pData指向它;
}
按目前为止,线程局部变量的个数为pData->pData分配或重分配内存,
用来容纳指向真正线程数据的指针
调用TlsSetValue(pData)保存pData
}
//把指向真正线程数据的pValue保存在pData对应的slot中
pData->pData[slot] = pValue
}
管理状态
在描述了MFC状态的实现机制之后,现在来讨论MFC的状态管理和相关状态的作用。
模块状态切换
模块状态切换就是把当前线程的线程状态的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中保存当前的模块状态对象,并把参数指定的模块状态设定为当前模块状态。所以该宏作为入口点的第一条语句就切换了模块状态。
更多内容请看PCdog.com--Fireworks教程 PPT教程 电脑入门教程专题
