Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1035983
  • 博文数量: 243
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 2975
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-02 21:11
文章分类

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-12-08 18:13:09

程所及的几个重要函数的算法

 

程所及的几个重要函数的算法描述如下:

  1. AllocSlot  

AllocSlot用来分配线程的MFC私有存的槽号。由于函数要修改全局_afxThreadData,所以必使用m_sect关键象来同多个线对该函数的用。

CThreadSlotData::AllocSlot()

{

关键段代EnterCriticalSection(m_sect);

搜索m_pSlotData找空槽(SLOT

如果不存在空槽(第一次,肯定不存在)

分配或再分配内存以建新槽,

m_pSlotData指向分配的地址。

得到新槽(SLOT)

SLOT已用

记录最新可用的SLOT到成员变m_nRover中。

开关键段代LeaveCriticalSection(m_sect);

返回槽号

}

  1. GetThreadValue

GetThreadValue用来线程的第slot线程局部量的一个线程局部量都占用一个且只一个槽位。

CThreadSlotData::GetThreadValue(int slot)

{

//得到一个CThreadData型的指pData

//pData指向MFC线程私有存

//m_tlsIndex_afxThreadData由构造函数

pData=(CThreadData*)TlsGetValue(m_tlsIndex),。

如果指空或slot>pData->nCount, 返回空。

,返回pData

}

  1. 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

}

7        管理状

 

在描述了MFC实现机制之后,在来讨论MFC的状管理和相的作用。

1)

就是把当前线程的线程状m_pModuleState指向即将运行模的模

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

先看MFCAFX_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 DLLMFC提供AFX_MAINTAIN_STATE实现压栈和出AFX_MANAGE_SATATE宏的作用是定一个AFX_MAINTAIN_STATE型的局部_ctlState

AFX_MAINTAIN_STATE的构造函数在其成员变m_pPrevModuleState中保存当前的模态对象,并把参数指定的模态设当前模。所以宏作入口点的第一条句就切了模

在退出模块时,局部_ctlState将自销毁这导AFX_MAINTAIN_STATE的析构函数被用,析构函数把保存在m_pPrevModuleState的状态设当前状

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

1 DLL出函数使用  

AFX_MANAGE_SATATE(AfxGetStaticModuleState())

其中,AfxGetStaticModuleState返回DLL的模afxModuleState

2 窗口函数使用

AFX_MANAGE_STATE(_afxBaseModuleState.GetData());

其中,_afxBaseModuleState.GetData()返回的是用程序的全局模

OLE使用的模方法有所不同,里不作讨论

上面讨论线行行不同模的代码时的情况。在线么处理模呢?

·                     一个(使用MFC用程序)的主线线程模程模,前者是_AFX_THREAD_STATE例,后者是_AFX_BASE_MODULE_STATE例。

 

·                     程的新的线程被,它建自己的线程状承父线程的模。在线程的入口函数_AfxThreadEntry完成这样理,函数的描述8.5.3

 

 

阅读(1972) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~