涉及到异步模式的编程,vb高手进!

yhwebus 2003-10-24 11:37:16
我有这么个需求

用户打开界面显示一条记录的详细信息, 所有的内容都显示出来了,但后台要继续执行一段代码(可能需要耗费10多秒,判断网络是否接通,是否有最新的文件,如果有则自动执行网络文件下载)

我是这么处理的

sub Form_Load()
'初始化并显示信息
....

'开始Timer记时,1秒以后开始执行后台工作
'否则一直要到后台工作执行完,界面才会完全显示
Timer1.InterVal=1000
Timer1.Enable=true
end sub

Sub Timer1_Timer()
'执行网络文件下载
'该过程可能会持续10秒
DownLoadFile(RecordNo) 'RecordNo为该详细信息记录对应的ID


'确保只执行一次后台工作
Timer1.Enable = false
End Sub

以上处理可以正常工作,但是碰到下面一个问题,用户打开界面以后,如果马上点击关闭按纽要10多秒以后才能响应(后台在执行文件下载)----有没有什么办法让用户可以马上关闭界面,但是DownLoadFile(RecordNo)继续执行结束
...全文
81 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoki 2003-10-24
  • 打赏
  • 举报
回复
呵呵~,是否可以这样欺骗一下客户?
点关闭的时候你可以先让界面visible,当DownLoadFile(RecordNo)才真正unload
yhwebus 2003-10-24
  • 打赏
  • 举报
回复
发信人: seamus (seamus), 信区: VB
标 题: Re: 请问如何在VB实现多进程编程?
发信站: 武汉白云黄鹤站 (Sun May 7 20:08:22 2000), 站内信件

VB中实现多线程只能用ActiveX EXE。
不要用CreateThread和AddressOf,除非你开的线程中不访问
Form和TextBox及其他任何控件,否则程序必Crash无疑。这跟
VB的机制有关,VB中的任何控件包括Form等都是基于COM的,
任何线程要访问COM Object,都必须先用CoInitialize初始化,
然后才能进入包含COM Object的Apartment中对COM Oject的属
性和方法进行访问。当然你也可以在你的线程中把CoInitialize
写进去,它是一个api,在ole32.dll中,但接下来你怎么办?你
还需要对interface中方法marshal出来才能用,除非你对COM的机
理很熟,否则这些工作对你来说负担太重了,也违背了VB这种开发
工具的本意。VB7据说可以用new thread来产生一个新线程,我想它
无非是把上面这部分工作给hide起来了,原理上应该不会有太多的
出入。
ActiveX EXE能实现多线程,是因为它的property中有个Thread Model
设置,你可以把它设为thread per object,这项设置意味着你可以在
工程中CreateObject或new一个基于新线程的对象。如果你的新线程中
含有GUI或msgbox等东西,可能还需要一些特别的技巧和设置,当然也
是能做的。

外面有很多关于VB的站点上提供了VB中实现多线程的SourceCode,都
用的是CreateThread,我以前也是这么做的,现在我发现我错了,而且
他们也都错了,我敢肯定。

aha99 2003-10-24
  • 打赏
  • 举报
回复
同意楼上的,不过下载的是网络连接,可以试一下。在unload里面不把下载程序结束,然后再下载程序结束时加上判断,看是否程序已经unload,然后销毁所有未销毁的部分
射天狼 2003-10-24
  • 打赏
  • 举报
回复
downloadfile是什么函数,如果像执行SQL语句一样的话即使用DOEVENTS也无济于事!!
Ranma_True 2003-10-24
  • 打赏
  • 举报
回复
用doevents试试吧,
如果你在一个大循环中加上doevents,即使unload me后,你会发现vb程序仍未结束(调试环境)
IsMe 2003-10-24
  • 打赏
  • 举报
回复
使用ActiveX EXE
Random 2003-10-24
  • 打赏
  • 举报
回复
我认为hhjjhjhj(大头) 的建议可以试一下。
yhwebus 2003-10-24
  • 打赏
  • 举报
回复
楼上的朋友们,试一下就知道了,建议是不可行了

应该用多线程的方案可以解决的,不知道谁有这方面的经验
hhjjhjhj 2003-10-24
  • 打赏
  • 举报
回复
把DownLoadFile那部分做成ActiveX
Dennis618 2003-10-24
  • 打赏
  • 举报
回复
用 form.hide 或者me.hide 隱藏窗體. timer事件照樣會執行的.不過當執行完以後你自己看有沒有必要unload me 羅.希望你能成功
yhwebus 2003-10-24
  • 打赏
  • 举报
回复
关键是它如何在结束DownLoadFile(RecordNo)前响应你的按纽点击事件ButtonClose_Click

如果它真能响应 visible=false的话,当然就能响应unload me 了

7,785

社区成员

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

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