• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 请教:关于COM组件中的辅助线程

请教:关于COM组件中的辅助线程

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了请教关于葫芦的形状,关于请教的名言,关于请教大师的笑话,关于请教的成语,关于虚心请教的名言等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 请教:关于COM组件中的辅助线程
描述:

// 某COM组件CA实现了IA接口。IA接口有一个函数IA_Func1,CA的实现如下:
class CA
{
//... 
void CA_Method1();
private:
long m_nValue;
};
HRESULT CA::IA_Func1()
{
CreateThread(NULL,0,threadProc,this,0,NULL);
return S_OK;
}
unsigned long CA::threadProc(LPVOID param)
{
CA *pCA = (CA*)param; //这个转换不确定是否能成功(STA、MTA、DCOM远程组件)
pCA->CA_Method1(); //由于上面的不确定,这里也不确定是否能成功调用
InterlockedIncreament(&pCA->m_nValue); //同上
return 0;
}
// threadProc只会调用CA类实现的函数或API函数,不会调用到其他接口;
// 这样能在各种客户端套间环境(STA/MTA/BOTH/None)下正确运行吗?
// CA的ThreadingModal对上述问题的答案有影响吗?

以我的理解,应该转换是安全的,因为不管是否跨越套间,IA_Func1实际上都应该似是在对象创建的套间中执行的,那么传递的this指针就应该能安全的转换为组件的实现类的指针。
如果在转换后调用到了其他的接口(非CA实现的接口,而是包容或聚合的接口)的话,那么转换就是不安全的。

请教各位高手,上述结论是否成立?
如果不行的话:由于IA_Func1是个很耗时的操作,所以必须开启工作线程。
在工作线程中如何才能安全的访问到CA类的辅助函数及类变量呢?


解决方案1:

只要在线程中调用的成员函数自己做线程同步就没有问题

解决方案2:

转换是可以的。传进去的this指针是对象本身的,即是一个类对象的指针,并不涉及代理存根和套间。
但是要指出的是,这么用非常危险,也很不合常理。 
这么用需要注意以下几个问题:
1. 这个对象的生命周期问题,确保线程内使用时,这个对象一定存在(因为这个指针已经脱离com引用计数的管理),否则会引起调用野指针的异常。
2. 线程的管理问题,在对象生命周期结束前,确保这些新创建的线程先结束
3.线程内调用到的对象的方法,需要进行多线程同步,如果没有涉及共享资源当然也就没这个问题了。

解决方案3:

感觉是没问题,主要要注意对相关变量的同步操作和客户端对组件的释放等


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 请教关于CriticalSection
  • 请教关于安全描述符的问题!
  • 请教关于dll的使用
  • 请教关于键盘钩子的问题
  • 请教,关于驱动程序里面读取磁盘文件的错误。
  • 请教关于CMFCMenuBar子菜单如何禁用或变灰处理
  • 请教关于vs2010连接mysql数据库问题
  • 请教:关于资源管理
  • 请教关于IE浏览器ToolBandCom程序问题?
  • 请教关于虚表与接口的问题

相关文章

  • 2017-06-04 谁能向我推建
  • 2017-06-05 如何使用AfxEndThread结束线程??
  • 2017-06-05 我想把对话框资源放入Dll中,应该怎么办,要做什么工作
  • 2017-06-05 怎么将一个字符串复制到剪切板上,然后在剪切板上再粘贴到文本框中
  • 2017-06-04 怎样将现有的INF和SYS驱动文件制作成SETUP安装
  • 2017-06-04 关于ATL控件的属性页的问题!!
  • 2017-06-04 在ATL和MFC混合编程中,如何在MFC继承的类中调用ATL接口中声明的方法。
  • 2017-06-05 操作其他进程中的TREEVIEW
  • 2017-06-05 网络游戏中的加速外挂的原理是什么?
  • 2017-06-04 VC下有没有类似MicrosoftForms20ObjectLibary的控件

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • vc通过ado访问64位oracle11g数据库的问题
    • 64位WIN7旗舰店版CGI初始化ADO错误GetLastError126,在命令行下直接调用却问题在XP下没也问题
    • 手头上有个自己写的类,比较复杂,请问怎么封装到DLL里面去
    • 如何在一个定时器中启动线程呢?
    • 如何注册COM组件
    • VC中为什么没有DataGrid这样的控件
    • IDL文件切分多个IDL的问题
    • 一个简单的线程同步问题:关于使用临界区
    • old对象的问题,请教高手!
    • 关于进程的反复调用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有