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

来源: 作者: 2007-12-14 出处:pcdog.com

adsl  ssl  多线程  
上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 下一页 

  否则,返回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教程  电脑入门教程专题
上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 下一页 
上一篇:MFC教程(10)-- 内存分配方式和调试机制
下一篇:MFC教程(9)-- MFC的进程和线程(1)