关于问题的具体描述是这样的:
1. 多线程程序
2. 有一个全局的对象池,对象池负责管理对象(包括创建),目的是为了更有效的地利用有限的CMyObj类的对象(因为这个类初始化工作需要花费不少时间)
3. CMyObj对象的初始化中包括创建COM对象,打开接口
4. 对于第一个线程来说,此时全局对象池为空,因此,对象池生成一个CMyObj对象,并用线程的特定参数对其初始化
5. 任意N多个线程(含有相同的参数)访问时,由于参数相同,为此,能够得到通过对象池获得同一个CMyObj的控制权(但在操作上是线程安全的,因为自己进行了临界区处理)。
6. 当第一个线程没有结束之前,其它线程获取到的该CMyObj对象的访问是正常的(包括对该对象中的COM指针的间接访问);但是一旦第一个线程结束,也即创建该COM对象的线程结束,则此时其它线程对该CMyObj对象的COM指针的变成非法。经检查,发现当第一个线程结束时,经由它创建的COM指针的地址就变成无效地址了??!!!基于上面的情况,我的问题就是:
Q1: 虽然我的对象池是全局的,但由于其内部的New操作与创建COM组件的操作,是由线程来调用实现的,因此,这个COM组件就是线程相关的了?其生存周期与该线程一致了?
Q2: 如何让COM指针的生存周期更长一些,不是随着创建它的线程的消失而结束?或者说有什么办法可以解决这样的问题?谢谢先!
1. 多线程程序
2. 有一个全局的对象池,对象池负责管理对象(包括创建),目的是为了更有效的地利用有限的CMyObj类的对象(因为这个类初始化工作需要花费不少时间)
3. CMyObj对象的初始化中包括创建COM对象,打开接口
4. 对于第一个线程来说,此时全局对象池为空,因此,对象池生成一个CMyObj对象,并用线程的特定参数对其初始化
5. 任意N多个线程(含有相同的参数)访问时,由于参数相同,为此,能够得到通过对象池获得同一个CMyObj的控制权(但在操作上是线程安全的,因为自己进行了临界区处理)。
6. 当第一个线程没有结束之前,其它线程获取到的该CMyObj对象的访问是正常的(包括对该对象中的COM指针的间接访问);但是一旦第一个线程结束,也即创建该COM对象的线程结束,则此时其它线程对该CMyObj对象的COM指针的变成非法。经检查,发现当第一个线程结束时,经由它创建的COM指针的地址就变成无效地址了??!!!基于上面的情况,我的问题就是:
Q1: 虽然我的对象池是全局的,但由于其内部的New操作与创建COM组件的操作,是由线程来调用实现的,因此,这个COM组件就是线程相关的了?其生存周期与该线程一致了?
Q2: 如何让COM指针的生存周期更长一些,不是随着创建它的线程的消失而结束?或者说有什么办法可以解决这样的问题?谢谢先!
解决方案 »
- 用VC2010编译出问题
- 获取edit control 的字符串 乱码
- 点鼠标为什么不能移动啊
- 诚心求教---键盘钩子的问题,急,在线!
- 请问信誉分。。。是什么啊
- 怎么得到已经运行的自动化服务器对象!
- 在delphi和vc中,怎么样引用从动态库输出的类?最好能给出一段souce code?
- 问一个傻问题ATL中Implement Interface选项有何用途?好像从tlb引入接口,但似乎并没有实现
- 大家告诉我什么网站有VC下载啊??我不想买碟啊~~
- MFC中如何读取文本数据存放到二维数组中,求大神指导
- 舍不得孩子套不住狼!100分求将url转换为ip地址的代码,要求能封装成库函数的那种!谢谢!
- 使用 “应用” 修改上一级窗口中的 视图 ??
2.GIT(Global Interface Table)
创建一个全局的指针CMyObj* p,然后由第一个线程进行初始化。
因为p是全局变量,所以第一个线程结束后,不会完结。
就和你的对象池一样,生存周期是全局的。
TO luohualiushui: 能否说得再详细一点?谢谢