• 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

佚名通过本文主要向大家介绍了com组件,com组件是什么,com组件下载,com组件注册,com组件编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: COM组件的某个函数需要长时间执行,网页不能跳转。
描述:

一个COM组件,导出的一个函数Add需要长时间执行,如下所示:

STDMETHODIMP CSimpObj::Add(short param1, short param2, long *plResult)
{
if(!plResult)return E_POINTER;
*plResult = param2 + param1;
for(int i=0;i<30000;i++)
{
Sleep(1);
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
DispatchMessage (&msg);
}
}
Fire_CalculateComplete( *plResult );
return S_OK;
}

网页中的代码如下:
<script type="text/javascript" for="simpobj" event="CalculateComplete(lResult)" language="javascript">
alert("计算结果是:" + lResult);
</script>

将该组件嵌入网页执行时,导致网页上的其它控件响应不灵敏(但是可以响应)。另外更严重的是,在该函数执行时网页无法跳转,在地址栏输入地址然后回车、使用javascript的location.href="www.baidu.com"都不行,要直到alert("计算结果是:" + lResult);代码执行完此对话框关闭之后就唰的一下跳转了。
必须在COM组件中使用工作线程吗?有没有其它的解决方法?谢谢!


解决方案1:

你通过GIT,做了marshal了,获得指针是proxy/stub,会对变量做线程的同步...

解决方案2:

没说要你把控件改成有窗口的控件,创建一个隐藏窗口即可,无窗口控件也能创建窗口。
工作线程是能触发事件,但不能直接调用Fire_XXX,也不能把接口指针作为线程函数的参数传递进来,因为指针需要列集。无论工作线程使用哪种方式进行成功的触发事件,核心都是隐藏窗口在工作,还不如自己直接创建隐藏窗口。

解决方案3:

IE内部有保护,当代码执行到ActiveX或者BHO中时,很多操作都被限制或者进入延迟执行队列,必须返回到IE中才能执行队列缓存的操作,不能导航就是一个例子,例如脚本执行window.open、location.navigate等操作都属于延迟操作。
在网页控件中使用多线程要非常小心,因为任何页面导航的发生将导致控件的生命期结束。一个组件的方法都应该尽快返回,如果操作耗时,那么应该使操作进入异步模式,使用工作线程或者使用定时器都可以选择,个人倾向于使用定时器,创建一个隐藏窗口处理定时器消息,一旦操作完成,可以直接调用Fire_***触发事件,如果操作还未完成而页面发生了导航,那么ActiveX控件会被释放,此时应该马上销毁窗口,停止定时器任务。

解决方案4:

这种情况工作就应该交给另一个线程了,本身就是计算,自然要放到另一个,而不是当前的UI线程等来阻塞UI...

解决方案5:

就用线程加链接点实现就可以,除了你线程应该没有其他合适的方法,你就是想要计算和界面响应的并行工作,在整个Windows平台做并行都是靠多线程支持的,即使是其他方法我估计本质也是Multithread。呵呵

解决方案6:

在这种情况下,不知道还能不能收到 OnBeforeNavigate2 ,如果可以的话可以让消息循环跳出。不过最好还是工作线程来解决。

解决方案7:

你为什么不把这段代码丢到工作线程中执行呢?


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

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

  • COM组件的变量问题?
  • DLL中对进程外的ActiveX/COM组件(EXE形式)的对象实例化问题,DLL内不支持调进程外COM??
  • 怎样将原来不支持COM的mfc类,成为com类
  • MFC实现COM的接口映射的问题。请教高手。急。。
  • COM+组件的注册问题?
  • 关于COM组件的问题
  • com组件全局变量问题
  • COM组件和主程序之间的数据传输问题??
  • MFC中添加服务器组件的注册问题。
  • Com组件使用Recordset的游标问题

相关文章

  • 2017-06-04 不同版本的COM怎么共存啊?
  • 2017-06-05 一个简单的问题但十分有用的问题
  • 2017-06-05 调用DLL中的无模式窗体,怎样释放?
  • 2017-06-04 如何实现类似于MediaPlayer那样的窗口???
  • 2017-06-05 如何结束进程
  • 2017-06-04 VC如何读写sqlsever2000数据库中的表
  • 2017-06-05 求指导关于0xC0000005:读取位置0x00000004时发生访问冲突
  • 2017-06-05 游戏编程是用哪些语言的?
  • 2017-06-05 请问,主线程和自己开的线程之间切换的机制是什么。。是根据时间片轮流切换么?
  • 2017-06-05 我的程序如何取到当前程序的焦点?我需要向当前程序别的程序的焦点文本框输入字符,应该怎么做?

文章分类

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

最近更新的内容

    • 祈祷sars早日被消灭!
    • 怎么在程序中打开我的电脑?就像在桌面双击这个图标?
    • 如何消除com组件的依赖?
    • 关于c++builder写的DLL用VC编译的问题
    • 怎样可以抓住线程消息?
    • NT/98下多进程Process处理不同,why?
    • 大虾们,菜鸟刚进论坛,有一个问题
    • 学习线程中的问题简单问题
    • 如何获取DOS应用程序的键盘输入?
    • VC英文内码下中文字符串显示乱码

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

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