您的位置:程序门 -> vb ->



用inet下载网页占cpu大,怎么办?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


用inet下载网页占cpu大,怎么办?
发表于:2007-06-29 18:11:07 楼主
我有几百个网址要下载
        for   i   =   1   to   500
                doevents
                htmlcode=inet1.openurl   (url)
                '这里省略若干代码
        next
cpu一直点100%,有什么方法吗?或者不用inet,有其它方法下载文件占cpu少一点吗?
发表于:2007-06-30 00:10:361楼 得分:0
winetapi
发表于:2007-06-30 01:57:292楼 得分:0
多线程下载.
发表于:2007-06-30 02:11:113楼 得分:0
下载这个dll:

http://www.m5home.com/soft/downurl.dll

然后在vb里面新建一个模块,放以下代码:

option   explicit

public   declare   function   downloadfile   lib   "downurl.dll "   (byval   fileurl   as   string,   byval   savefilename   as   string,   byval   funcaddr   as   long)   as   long
public   declare   sub   abortalldownload   lib   "downurl.dll "   ()
private   declare   function   lstrcpy   lib   "kernel32.dll "   alias   "lstrcpya "   (byval   lpstring1   as   string,   byval   lpstring2   as   long)   as   long

public   function   dllcallback(byval   fileurl   as   long,   byval   fileurllength   as   long,   byval   savefilename   as   long,   _
                                                        byval   savefilenamelength   as   long,   byval   totalbyte   as   long,   byval   nowreadbyte   as   long)   as   boolean
        dim   i   as   string,   j   as   string,   k   as   long
       
        if   fileurllength   >   0   then
                i   =   space(fileurllength)
                lstrcpy   i,   byval   fileurl
        end   if
        if   savefilenamelength   >   0   then
                j   =   space(savefilenamelength)
                lstrcpy   j,   byval   savefilename
        end   if
       
        debug.print   i   &   "/ "   &   j   &   "/ "   &   totalbyte   &   "/ "   &   nowreadbyte
       
        dllcallback   =   true
end   function

调用:

call   downloadfile( "http://xxx/index.htm ",   "d:\index.htm ",   addressof   dllcallback)

这个就是直接下载到文件的,调用后是立即返回,在后台以一个单独线程下载.

可以多次调用,这样可以同时下载n多文件.

初学汇编的作品,进度显示还有点问题,hoho.....:)
发表于:2007-07-02 11:14:584楼 得分:0
多谢myjian,不过如果每个网页都要先保存到硬盘,再读取,那太慢了
发表于:2007-07-02 13:06:145楼 得分:0
同步就行,就用异步嘛.inet不是有一个异步方式的嘛.看看是不是有一个EXECute开头的方法
发表于:2007-07-04 22:01:566楼 得分:0
如果不想保存到硬盘的话,那就直接从回调里面取得吧

我再改改
发表于:2007-07-06 14:40:187楼 得分:0
myjian,你的程序占用cpu也是很大,和inet一样
我这样测试,不知有没有问题

private   sub   command1_click()
        dim   i
        for   i   =   1   to   100
        call   downloadfile( "http://www.baidu.com/index.php ",   "f:\vb_long\downurl.dll\web\index "   &   i   &   ".htm ",   addressof   dllcallback)
        debug.print   i
        next
end   sub
发表于:2007-07-08 23:53:248楼 得分:0
用activex   exe改成多线程,然后不要用inet1.openurl,用inet1.EXECute.这样就快多了
发表于:2007-07-09 13:27:019楼 得分:0
我的那个dll还没稳定,嘿嘿

等我把回调搞完整

现在回调过程里不能使用vb自身的函数,一用的话,编译后就会挂.....

听说是vb函数都是非线程安全的.....
发表于:2007-07-14 21:05:5010楼 得分:0
myjian:多谢你

youchenglong:我要的是多线程下载,只能用inet1.EXECute实现,activex   exe我不懂.
发表于:2007-07-16 09:24:3711楼 得分:0
将   doevents   换成   api   的   sleep,然后调试一下在省略的代码中那部分最费时,设法加些   sleep   语句
发表于:2007-07-16 23:27:1512楼 得分:0
tiger_zhao(vb老鸟)   :加sleep是可以减少cpu,但也增加了时间,不是好方法
发表于:2007-07-17 00:01:2313楼 得分:0
要弄清楚到底是在循环添加下载时占cpu,还是添加完成后的下载过程占cpu?

inet1.EXECute,这个方法其实也是异步的,事件返回式

它应该不会造成cpu一直100%.
发表于:2007-07-17 01:53:3014楼 得分:0
帮你弄了个代码....你试一下吧:

http://www.m5home.com/blog/blogview.asp?logid=418

没下载完之前要是cancel,也会100%....(在我的机器上是50%,因为是双核;单cpu上就是100%了)

原因不明....困了....

但在下载过程中在我的机器占用很小,1%   -   5%左右.你看看吧.
发表于:2007-07-19 22:59:2715楼 得分:0
myjian:用http://www.m5home.com/blog/blogview.asp?logid=418的代码试了一下,也是100%的cpu,是在是添加完成后的下载过程占cpu   100%
用我上面那个代码,因为openurl是同步方式,所以是在循环的过程中占cpu
myjian你的程序理论上比我的占cpu更大,因为你是n个一齐下载,而我上面那个是n个轮流下载,不过无论怎样,在我的电脑上都占到了100%的cpu

我的电脑cpu是p3   850mhz   可能是我的cpu太烂了,不过人家的vc写的同类程序就占很小cpu,并且我用迅雷一次性添加很多个下载,也不会占到100%cpu,到底是我的cpu太烂,还是vb的确占cpu,我也不知道.

多谢myjian
发表于:2007-07-19 23:45:3616楼 得分:0
汗,你的机器是怎么回事呢?

从代码上来说,异步方式工作,其实在控件内部应该是多线程方式下载,并以回调通知来触发事件

这种方式中,只要控件内部设计不出问题(比如线程体没处理好之类),应该不会完全占用cpu.

而我现在又试了一下,下载过程中会有30%   -   40%的总体cpu占用量,但是这是杀毒软件的占用啊

exe本身单独占用cpu是非常低的

建议楼主看看清楚是谁在占cpu.

另外,也请其它朋友帮忙测试一下吧,源码,exe都有,下载也不需要注册,就几分钟的事...
发表于:2007-07-20 04:34:5817楼 得分:0
该回复于2007-12-28 17:45:08被管理员或版主删除
发表于:2007-07-20 11:12:3918楼 得分:0
myjian:天啊,真是的杀毒软件所致,我关了杀毒软件,cpu就很低了!!!!
发表于:2007-07-20 11:13:1219楼 得分:0
是system进程在占cpu
发表于:2007-07-20 11:13:4620楼 得分:0
但不知为什么vc写的类似程序不会引起杀毒软件狂占cpu
发表于:2007-07-20 12:18:4921楼 得分:0
system进程的占用率等于cpu空闲率....

由于这代码在一瞬间就建立了几百个文件,按常理来说,应该是要去看看的

于是杀毒软件来瞅两眼也很正常

一个文件就要经过n多病毒特征码的查询,文件一多,查询过程的效率就很重要了吧...

你用的是什么牌子的?

我用瑞星,也才30%   -   40%左右啊,没到100%那么夸张

至于其它语言写的,应该也是一样,我看晚上有没有空,用vc也写一个吧
发表于:2007-07-20 20:29:4722楼 得分:0
myjian:如果其它语言写的类似程序占用cpu也是这么多的话,我也不去计较了,但人家占cpu有多,唯有vb占cpu多,所以觉得不爽
发表于:2007-07-21 08:39:3723楼 得分:0
那不是vb的错,是自己水平的limitations.
发表于:2007-07-28 10:27:5424楼 得分:0
myjian:多谢你

youchenglong:我要的是多线程下载,只能用inet1.EXECute实现,activex   exe我不懂.
---------------------------
你已经用上了inet,多线程只能用activex   exe啦,我这段时间刚好就在做这
发表于:2007-07-31 02:51:2225楼 得分:0
可以用inet.EXECute   +activex   exe   +类实现动态的多线程,不过速度没有大的提升,差不多2.5倍,而且5-1000个线程速度都差不多
发表于:2007-08-23 21:02:5826楼 得分:0
inet最好使用get方法,异步处理.尤其你这样连续执行的.不但会占cpu,而且非常容易出错.
发表于:2007-08-30 15:22:3927楼 得分:0
inet   都是垃圾函数,   试一下专业的下载控件:
  使用糖果专业下载组件,可以使你的软件在网络数据获取方面达到专业水准,而无需了解复杂的网络底层和网络协议。   糖果专业下载组件在以下方面有突出优势:

http://www.languangav.com/soft/product_down.htm
发表于:2007-09-30 10:14:1728楼 得分:0
for       i       =       1       to       500  

inet1.EXECute   list1.list(i)
        do   '\'开始接受数据
                do   until   inet1.stillEXECuting   =   false   '\'这里阻塞前面的inet1,你可以将此do取消了试一次
                      doevents
                loop
                a   =   inet1.getchunk(512,   icstring)
                if   len(a)   =   0   then   exit   do
                text5.text   =   text5.text+a
        loop
                next
发表于:2007-10-14 15:45:1829楼 得分:0
楼上的问题我很感兴趣哦,尤其是多线程   activex   exe到底是什么东东啊,有谁比较懂得麻烦给点相关资料哦   谢谢咯
发表于:2007-10-14 17:29:2730楼 得分:0
君欲善其事,必先利其器,既然你不知道activex   exe,而又要用到它,哪么,就先学习它!在msdn中有详细的例子,也有vb6自带的例子!
当然你用老马编的dll也可以,将困难的事儿都抛给老马,不过,你这个软件有了收益时,别忘了人家的核心代码啊


快速检索

最新资讯
热门点击