vb调用CreateObject后有时会弹出一个对话框,如何事前避免此对话框

wdthkyou 2010-12-26 12:01:29
我用Set srf = CreateObject("Surfer.Application")创建了一个Surfer应用
当它运行结束之前,如果不小心点击了运行窗体就会弹出一个对话框:
由于其他应用程序忙,不能执行该操作,选择“切换到”按扭以激活忙的应用程序并纠正该错误!

搜索了微软的http://support.microsoft.com/kb/240809(如何防止使用 OLE 自动化"切换到"或"应用程序忙"错误消息
),按照提示增加了如下代码(红色字体):
Set srf = CreateObject("Surfer.Application")
App.OleRequestPendingTimeout = 0 '如果发生了鼠标或键盘的事件,将不会显示忙消息
....
问题依然存在,请各位大虾指教,谢谢!
...全文
234 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdthkyou 2010-12-27
  • 打赏
  • 举报
回复
暂时没有直接好办法,根据大家提供的思路,我采用了一个间接方法:将Surfer绘图部分单独写成exe文件,主调程程序隐藏调用,这样就变成主调程序判断绘图完成与否的问题,这一点还是容易实现的。谢谢各位大虾!结贴了。
Tiger_Zhao 2010-12-27
  • 打赏
  • 举报
回复
是你的程序用同步方式调用了 Surfer 某个方法后尚未返回,点击你的窗体就会出现这个提示。
找找 Surfer 的方法中有没有异步方式调用的方法,就能避免这种情况。
wdthkyou 2010-12-26
  • 打赏
  • 举报
回复
具体操作过程:
点击窗体上一个按钮(调用surfer绘图)。此时绘图过程一般需要20-40秒不等(视当前主流pc机性能而定)。如果在等待期间,用户无意中点击一下窗体任何位置,就会弹出上述对话框信息,然后点击“切换到(S)...”按钮后对话框消失,程序才继续执行。如果绘图未完成,亦即surfer.Quit未执行之前点击窗体就存在上述问题,谢谢大虾回复!
wdthkyou 2010-12-26
  • 打赏
  • 举报
回复
谢谢cbm666的回复。
弹出窗口估计类似MsgBox,不是surfer应用窗口,而且程序中也调用了surfer.visible=False 语句
cbm6666 2010-12-26
  • 打赏
  • 举报
回复
不知道你具体的运作, 点击后的事件你应该可以用if 变量 来判断 不让它弹出吧
cbm6666 2010-12-26
  • 打赏
  • 举报
回复
创建了一个Surfer 点击后将弹出一个窗口 类似MsgBox吗? surfer.visible=False ??

你可以加一个Timer 随时监测这个窗口出现 立马关掉
ning1958 2010-12-26
  • 打赏
  • 举报
回复
好像加了别的东西,不是通用Object
wdthkyou 2010-12-26
  • 打赏
  • 举报
回复
谢谢myjian提供的好思路!!我尝试一下。

嗷嗷叫的老马 2010-12-26
  • 打赏
  • 举报
回复
如果以上方案无实现条件,则可以在绘图循环中,定一个释放CPU机制,思路:

维护一个时间戳,绘图过程中以当前时间戳与之比较,达到0.1秒时,调用一下Doevents.

这样的话可以对绘图过程的效率影响减到比较少的程度,也能让界面不至于出现那个对话框.

具体释放CPU的时间可以自己调整一下.

所用API为gettickcount.
嗷嗷叫的老马 2010-12-26
  • 打赏
  • 举报
回复
绘图过程并没有释放控制权,导致了这个问题

既然是将绘图过程放在另一对象中的,那就可以把这个对象编译为ActiveX EXE,然后工程选项里设置"线程模型"为"每对象对应一个线程",则你在主工程中使用CreateObject创建对象时,那个对象就会位于另一线程中了.

但是即使是这样,仍然要避免在绘图时,主工程中其它对此对象的交互操作,不然仍然会出现这个框.

参考:

如何在VB6里面实现稳定的多线程
东方之珠 2010-12-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wdthkyou 的回复:]
具体操作过程:
点击窗体上一个按钮(调用surfer绘图)。此时绘图过程一般需要20-40秒不等(视当前主流pc机性能而定)。如果在等待期间,用户无意中点击一下窗体任何位置,就会弹出上述对话框信息,然后点击“切换到(S)...”按钮后对话框消失,程序才继续执行。如果绘图未完成,亦即surfer.Quit未执行之前点击窗体就存在上述问题,谢谢大虾回复!
[/Quote]

绘图过程应考虑使用独立线程进行。
wdthkyou 2010-12-26
  • 打赏
  • 举报
回复
谢谢大家的帮助!再等等奇迹的出现。
dingyanwei 2010-12-26
  • 打赏
  • 举报
回复
这个问题经常遇到,还没有好的解决办法。
wdthkyou 2010-12-26
  • 打赏
  • 举报
回复
加个doevents也没有效果。试用了多种方法(如FindWindow找到对话框窗体就发送关闭消息等)也没有效果,感觉微软只认对话框上面的两个按钮:“切换到(S)...”和“重试”。单击对话框右上角的关闭按钮也无效。可惜不会向对话框上的命令按钮发送消息技术,因为不懂如何获得按钮的句柄之类的技术。谢谢各位大虾!
dbcontrols 2010-12-26
  • 打赏
  • 举报
回复
加个doevents试试

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧