邦泰 → 環球論壇 → 異步多線程用VB編寫下載程式源代碼-.NET教程,VB.Net語言
|
標題:異步多線程用VB編寫下載程式源代碼-.NET教程,VB.Net語言 |
樹形
打印
收藏
推薦
|
等級:職業俠客 文章:449 積分:3581 註冊:2011-10-26 |
異步多線程用VB編寫下載程式源代碼-.NET教程,VB.Net語言 為了高效率地下載某站點的網頁,我們可利用vb的internet transfer 控件編寫自己的下載程式, internet transfer 控件支持超文本傳輸協議 (http) 和文檔傳輸協議 (ftp),使用 internet transfer 控件能夠通過 openurl 或 execute 方法連接到任何使用這兩個協議的站點并檢索文檔。本程式使用多個internet transfer 控件,使其同時下載某站點。并可判斷文檔是否已下載過或下載過的文檔是否比服務器上當前的文檔陳舊,以決定是否重新下載。任何下載的文檔中的鏈接都做了調整,以便于本地查閱。
openurl 方法以同步方式傳輸數據。同步指的是傳輸操作未完成之前,不能執行其他過程。這樣數據傳輸就必須在執行其他代碼之前完成。
而 execute 方法以異步方式傳輸數據。在調用 execute 方法時,傳輸操作和其他過程無關。這樣,在調用 execute 方法后,在后臺接收數據的同時可執行其他代碼。
用 openurl 方法能夠直接得到可保存到磁盤的數據流,或直接在 textbox 控件中閱覽(假如數據是文本格式的)。而用 execute 方法獲取數據,則必須用 statechanged 事件監控該控件的連接狀態。當達到適當的狀態時,調用 getchunk 方法從控件的緩沖區獲取數據。
首先,建立啟始的http檢索連接,
public g as variant
public k as variant
public spath as string
dim links() as string
g = 0
spath = 本地保存下載文檔的路徑
links(0)=啟始url
inet1.execute links(0), "get" 注釋:使用get方法。
事件監控子程式(每個internet transfer 控件配置相對應的事件監控子程式):
用statechanged 事件監控該控件的連接狀態, 當該請求已完成,并且任何數據均已接收到時,調用 getchunk 方法從控件的緩沖區獲取數據。
private sub inet1_statechanged(byval state as integer)
注釋:state = 12 時,使用 getchunk 方法檢索服務器的響應。
select case state
注釋:...沒有列舉其他情況。
case icresponsecompleted 注釋:12
注釋:獲取links(g)中的協議、主機和路徑名。
addsuf = left(links(g), instrrev(links(g), "/"))
注釋:獲取links(g)中的文檔名。
fname = right(links(g), len(links(g)) - instrrev(links(g), "/"))
注釋:判斷是否是超文本文檔,是超文本文檔則分析其中的鏈接,若不是則存為二進制文檔。
if instr(1, fname, "htm", vbtextcompare) = true then
注釋:初始化用于保存文檔的filesystemobject對象。
set fs = createobject("scripting.filesystemobject")
dim vtdata as variant 注釋:數據變量。
dim strdata as string: strdata = ""
dim bdone as boolean: bdone = false
注釋:取得第一塊。
vtdata = inet1.getchunk(1024, icstring)
doevents
do while not bdone
strdata = strdata & vtdata
doevents
注釋:取得下一塊。
vtdata = inet1.getchunk(1024, icstring)
if len(vtdata) = 0 then
bdone = true
end if
loop
注釋:獲取文檔中的鏈接并置于數組中。
dim i as variant
dim po1 as variant
dim po2 as variant
dim oril as string
dim newl as string
dim lmtime, ctime
po1 = instr(1, strdata, "href=", vbtextcompare) + 5
po2 = 1
dim newstr as string: newstr = ""
dim whostr as string: whostr = ""
i = 0
do while po1 > 0
newstr = mid(strdata, po2, po1)
whostr = whostr + newstr
po2 = instr(po1, strdata, ">", vbtextcompare)
注釋:將原鏈接改為新鏈接
oril = mid(strdata, po1 + 1, po2 - po1 - 1)
注釋:假如有引號,去掉引號
ln = replace(oril, """", "", vbtextcompare)
newl = right(ln, len(ln) - instrrev(ln, "/"))
whostr = whostr & newl
if ln <> "" then
注釋:判定文檔是否下載過。
if fileexists(spath & newl) = false then
links(i) = addsuf & ln
i = i + 1
else
lmtime = inet1.getheader("last-modified")
set f = fs.getfile(spath & newl)
ctime = f.datecreated
注釋:判斷文檔是否更新
if datediff("s", lmtime, ctime) < 0 then
i = i + 1
end if
end if
end if
po1 = instr(po2 + 1, strdata, "href=", vbtextcompare) + 5
loop
newstr = mid(strdata, po2)
whostr = whostr + newstr
set a = fs.createtextfile(spath & fname, true)
a.write whostr
a.close
k = i
else
dim vtdata as variant
dim b() as byte
dim bdone as boolean: bdone = false
vtdata = inet2.getchunk(1024, icbytearray)
do while not bdone
b() = b() & vtdata
vtdata = inet2.getchunk(1024, icbytearray)
if len(vtdata) = 0 then
bdone = true
end if
loop
open spath & fname for binary access write as #1
put #1, , b()
close #1
end if
call devjob 注釋:調用線程調度子程式
end select
end sub
private sub inet2_statechanged(byval state as integer)
...
end sub
...
線程調度子程式,g和是k公用變量,k為最后一個鏈接的數組索引加一,g初值為零,每次加一,直到處理完最后一個鏈接。
private sub devjob()
if not g + 1 < k then goto reportline
if inet1.stillexecuting = false then
g = g + 1
inet1.execute links(g), "get"
end if
if not g + 1 < k then goto reportline
if inet2.stillexecuting = false then
g = g + 1
inet2.execute links(g), "get"
end if
...
reportline:
if inet1.stillexecuting = false and inet2.stillexecuting = false and ... then
msgbox ("下載結束。")
end if
end sub
文章出處:飛諾網(www.diybl.com):http://www.diybl.com/course/4_webprogram/asp.net/netjs/20100722/490591.html文章來自: http://www.molikk.cn
|
|
|
2011-12-28 08:17 |
|
等級:小飛俠 文章:1531 積分:11409 註冊:2010-10-30 |
優惠代開全國?票【咨詢電話:13714748546黃先生QQ296898582。】13714748546黃先生QQ296898582 【驗后付款 信譽第一 互惠互利】優惠代開全國?票
優惠代開全國?票【咨詢電話:13714748546黃先生QQ296898582。】13714748546黃先生QQ296898582 【驗后付款 信譽第一 互惠互利】優惠代開全國?票
優惠代開全國?票【咨詢電話:13714748546黃先生QQ296898582。】13714748546黃先生QQ296898582 【驗后付款 信譽第一 互惠互利】優惠代開全國?票
【咨詢電話:13714748546黃先生QQ296898582】為你提供北京,沈陽,鄭州,太原,無錫,蘇州,南京,杭州,濟南,青島,廈門,泉州票開,廣州,深圳,東莞,中山,佛山票開,惠州,武漢,長沙,西安,重慶,成都,南昌開票等等城市票,開增值稅票,本公司實力雄厚,有著良好的社會關系,了解財稅法律法規,實行規范管理及嚴格履行的保密制度。專業從事財務辦理、稅務辦理、財稅咨詢和工商辦理等業務的專業機構。與全國多家公司有著密切的業務聯系,可以為企業單位辦理:財務、稅務及相關信息咨詢,包括增值稅、商品銷售票、建筑工程票、運輸票、廣告票、服務票等,公司成立多年一直堅持以“誠則興”為中心,立足于市場之中。本公司鄭重承諾提供咨詢及服務絕對真實可*,歡迎合作。業務項目:
一: 增值稅專用票、海關專用繳款書.13714748546黃生QQ296898582
二: 普通國票: 1:商品銷售; 2:貨物統一銷售; 3:工業(企業)銷售;13714748546黃生QQ296898582
三:普通地票: 1:運輸(電腦版運輸,貨運開,國際運輸,裝卸,聯運,海運), 2:其它服務(廣告費,住宿費,會議費,定額餐飲,咨詢費等) , 3:建筑安裝, 4:加工修理, 5:其它(租賃,行政事業專用,機動車銷售,房地產交易,廢舊物資回收,稅務)等專用票。所有票據均可在貴司當地稅務局驗證抵扣,(可上網查,也可拿到稅務局查驗,全國各地均可開票! 如貴公司有票務方面的需求,歡迎來電或留言咨詢.我們會在第一時間回復您!13714748546黃生QQ296898582 |
|
|
2012-02-18 06:13 |
|
等級:論壇遊民 文章:144 積分:948 註冊:2011-04-12 |
|
2012-03-29 14:41 |
|
|