问一个 VB Activex Exe 多进程 阻塞的问题

IDNCC 2009-12-04 05:53:40
最近用VB6做一个FTP...相对比较完整 从各种相互拖放到上传下载续传 再到批量上传下载删除 基本上还算顺利.
但是目前卡在一个比较尴尬的问题...

大家都知道FTP用的是上传带宽两个字...不宽.而且还有一个服务器响应的问题.
为了在网速不好的情况下不让进程死锁.使用了传说中的 ActiveX EXE 来创建多线程(伪)

目的是达到了...主进程不卡了...但是在数据流传输中和等待服务器响应的时候会主进程死锁... 不让操作连点一下都不行

参考了好多资料...也检查了代码...实在是找不出问题

网络上流传着利用TIME来解决这个问题的办法...但是我压根没去试...因为用TIME的话就很局限了.

希望各位大大有好的解决办法.



...全文
464 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2009-12-04
  • 打赏
  • 举报
回复
还没具体应用过这些东东,友情Up...........
sonic_andy 2009-12-04
  • 打赏
  • 举报
回复
我记得MSDN中对于ActiveX EXE来执行任务就是用Timer控件来示范的,好像叫CoffeeMonitor,具体可以看MSDN中的教程,我这里摘一段:

创建 ActiveX EXE 部件


部件以对象方式提供可重用代码。通过创建对象并调用其属性和方法来使用部件的代码的应用程序,被称作客户。

相对于使用部件对象的客户端而言,部件可以运行于进程内或进程外。进程外部件或 ActiveX EXE,在自己的地址空间中运行。而客户通常是运行在其它进程中的应用程序。

图3.1 客户端和进程外部件



进程外部件运行在自己的进程中,这意味着客户端可以通知部件做某事,然后当部件工作时客户端可以继续它自己的工作。当这样的系统正确建立后,部件能在任务结束时使用异步通知来通知客户端,这在“建立代码部件”的“异步的回调与事件”中解释。

注意 “部件设计的一般原理”中的“进程内和进程外代码部件”讨论了进程内和进程外代码部件的区别。

本章将通过构造一个叫做 CoffeeWatch 的简单部件来逐步解释进程外部件的创建和使用。CoffeeWatch 演示了模式的和无模式对话框的行为,并演示了一种用事件来实现异步通知的方法。

通过在 Visual Basic 开发环境的两个不同的实例中运行部件和测试工程,会看到如何在进程外调试 ActiveX E XE。

创建 Coffee 部件的过程互相依赖。因此执行过程的顺序非常重要:

主题
vbconCreatingServer 创建 Coffee 工程
打开新的 ActiveX EXE 工程,设置必要的工程信息,并且添加演示模式和无模式窗体所需的模块。

vbconSettingUpNewOLEServerProject 显示 CoffeeMonitor 类的窗体
添加显式模式或无模式窗体的代码。

创建 CoffeeWatch 测试工程
说明如何在开发环境的第二个实例中创建测试工程。往测试工程中添加代码来调用 CoffeeMonitor 方法。

vbconCreatingPropertiesMethods 模式和无模式窗体在进程外如何运转
说明了当它们与客户的主窗体不在同一个进程中时,模式窗体和无模式窗体显示是不同的。

vbconAddingCodeForInitializeTerminateEvents 提供异步通知事件
说明如何建立向一个或多个客户提供异步通知的对象。

vbconRunningProject 接收异步通知事件
往客户中添加代码来请求异步通知,并当通知事件发生时采取某些行动的代码。

vbconSharingCoffeeMonitor 共享 CoffeeMonitor
创建 Connector 对象,客户可以用它来获取对于单个共享的 CoffeeMonitor 实例的引用。

vbconUsingSharedCoffeeMonitor 使用共享的 CoffeeMonitor
往客户中添加代码来申请 Connector 对象,然后调用 CoffeeMonitor 的属性来获得对共享的 CoffeeMonitor 对象的引用。

vbconCreatingTestingExecutable 创建并测试可执行的 Coffee
编译 Coffee 部件和 CoffeeWatch 测试程序。用一个 Coffee.exe 实例来运行 CoffeeWatch 工程和几个 CoffeeWatch.exe 实例。

vbconCTcmp02Recap 总结 ActiveX EXE 部件的创建
概述进程外部件的设计和创建一般过程。



准备工作
如果按下述方式设置了开发环境,这些过程就会变得更容易了。

要准备工作,请按照以下步骤执行:

在“视图”菜单上,单击“工具箱”打开工具箱。


在“视图”菜单上,单击“工程资源管理器”打开“工程资源管理器”窗口。“工程资源管理器”窗口将广泛使用于工程文件之间的切换。


如果“工程资源管理器”窗口在文件夹状态,单击“工程资源管理器”窗口工具栏上的“切换文件夹”按钮关闭文件夹。如下面所示。



在“视图”菜单上,单击“属性窗口”打开“属性”窗口。


在“工具”菜单上,单击“选项”打开“选项”对话框。
选中“编辑器”选项卡,并确认“要求变量声明”被选中。这样很容易捕捉键盘输入错误。

选中“环境”选项卡。确认“提示保存改变”被选中,然后单击“确定”。这样当您离开时,很容易保存对工程所做的变更。

示例应用程序
Coffee2.vbp, CoffWat2.vbp, MTCoffee.vbp.
Coffee2.vbp 和 CoffWat2.vbp 包含本章的扩展的源代码。除了使用事件的异步通知外,它们还包括在辅助接口上使用回调方法的替换版本,以及可用来替代计时器控件的全代码 Timer 示例。MTCoffee 说明了多线程的某些特征。示例应用程序列在Samples 目录中。

嗷嗷叫的老马 2009-12-04
  • 打赏
  • 举报
回复
路过..........
silencenet 2009-12-04
  • 打赏
  • 举报
回复
另外... 这个AX在执行长时间代码期间应该也是要与主程序交互的..比如(主程序要暂停AX的上传操作)
我想到的方法也只能在上传期间不断用事件(利用ByRef参数)来从主程序返回判断,是否中止AX的操作...
silencenet 2009-12-04
  • 打赏
  • 举报
回复
就VB来说,只能使用Timer来实现
比如写Activex.Exe(简称AX)的公共方法时
一般都是这样...
Sub F()
在这里写长时间执行的代码
End Sub
----------------------------------------------------------
现在要改一下...
用一个全局变量保存这个公共方法的状态,是否已经调用
private mF as Boolean
Sub F()
mF=True
Timer.Enabeld=True '这里开启记时器检测
End Sub


而在Timer中用循环检测
private sub Timer_Timer()
if mF then
'看完后面说明再看这一句
触发事件告诉主程序,该AX不能使用
'End 看完下面后再看这一句

mF=False
Timer=False '关闭计时器
'在这里执行长时间代码....

'看完后面说明再看这一句
触发事件告诉主程序,该AX可以使用了
'End 看完下面后再看这一句

End If
End Sub

----------------------------------------
但这里又有问题出现了,在计时器事件中,如果那个长时间的代码没有执行完,你再次调用AX的任何方法或属性时,也会出现那个服务器忙的对话框... 所以,这个AX必须告诉主程序,他是否可以调用了...
这个逻辑有点麻烦的... 偏门方法只能这样了
至于Timer局限性,这个并没有...
你可以用窗口+Timer单独写一个类出来,就好调用了...
IDNCC 2009-12-04
  • 打赏
  • 举报
回复


这是我的软件的那个破提示

自己写的FTP啊~
  • 打赏
  • 举报
回复
用那个FTP?

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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