AfxGetModuleState() 与 AfxGetModuleThreadState()

http://blog.pfan.cn/sword2008/29453.html

http://blog.pfan.cn/sword2008/29453.html

 

AfxGetModuleState()可以获得与执行线程关联的AFX_MODULE_STATE,而AfxGetModuleThreadState()可以获得与执行线程关联的AFX_MODULE_STATE与当前执行线程关联的AFX_MODULE_THREAD_STATE。我们可以这样理解,每一个线程在执行的时候,需要以一个Module作为缺省上下文,比如查找资源的时候,默认从该Module里查找。这就是为什么我们需要在DLL的输出函数入口处进行资源切换,其实是把调用者线程的上下文设为当前代码所在的Module,从而保证资源的正确装载。另外,Module里代码需要根据不同的执行线程保存不同的全局数据(是不是为了避免访问的冲突?),于是Module还可以有自己独有的线程相关的数据。所以,AFX_MODULE_STATE可以在不同线程中使用,而AFX_MODULE_THREAD_STATE只能在特定线程中使用。

 

举个例子:

 有三个线程a,b,c,每个线程都访问统统一个Dll(相当于一个Module),那么在这个DLl中就会为每个线程保存不同的数据,如果a线程调用了此DLL,则线程a会暂时把此Dll作为缺省上下文(缺省上下文:相关联的对象),在dll中调用AfxGetModuleThreadState()就会获取到线程a的私有数据成员

在MFC(Microsoft Foundation Classes)中定义全局变量通常可以通过以下几种方式: 1. 使用C++的全局变量: 可以直接在C++代码中定义全局变量。这些全局变量在整个程序中都是可见的,除非它们被隐藏或者作用域被限制。 2. 使用单例模式: 在MFC中,可以通过实现单例模式来创建一个全局访问点。单例模式确保一个类只有一个实例,并提供一个全局访问点。在MFC中,通常会有一个全局的CWinApp派生类的实例,通过这个实例可以访问到很多全局可用的数据。 3. 使用C运行时库的全局数据: 在MFC程序中,可以使用C运行时库的全局数据函数来定义和操作全局变量。比如使用`_putenv`和`_getenv`来操作环境变量。 4. 使用全局函数: 定义一些全局函数来访问全局数据。这些函数可以在任何地方被调用,从而间接地实现全局变量的功能。 5. 使用MFC模块状态: MFC内部使用模块状态来管理全局和模块特定的信息。例如,可以使用`AfxGetModuleThreadState`来获取模块线程状态,然后设置或获取信息。 示例代码: ```cpp // 定义一个全局变量 int g_nGlobalVariable; // 如果使用单例模式创建全局访问点 class CMyApp : public CWinApp { public: static CMyApp* GetInstance() { return AfxGetApp(); } // ... 其他成员和函数 ... }; // 在程序的某处使用 int main() { // 使用单例模式获取实例,并操作全局变量 CMyApp* pApp = CMyApp::GetInstance(); pApp->m_nSomeGlobalVariable = 10; return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值