用VB編寫非同步多執行緒下載程式 (轉)
用VB編寫非同步多執行緒下載程式 (轉)[@more@]
大慶油田有限公司勘探開發研究院室 滿孝
為了高地下載某站點的網頁,我們可利用VB的Inte Traner 編寫自己的下載程式, Internet Transfer 控制元件支援超文字傳輸 (HTTP) 和傳輸協議 (),使用 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 Sub1_StateChanged(ByVal State As Integer) 'State = 12 時,使用 GetChunk 方法檢索伺服器的響應。 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 '初始化用於儲存檔案的FileSystem。 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 L '獲取文件中的連結並置於陣列中。 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
用VB編寫非同步多執行緒
大慶油田有限公司勘探開發研究院室 滿孝
為了高地下載某站點的網頁,我們可利用VB的Inte Traner 編寫自己的下載程式, Internet Transfer 控制元件支援超文字傳輸 (HTTP) 和傳輸協議 (),使用 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 Sub1_StateChanged(ByVal State As Integer) 'State = 12 時,使用 GetChunk 方法檢索伺服器的響應。 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 '初始化用於儲存檔案的FileSystem。 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 L '獲取文件中的連結並置於陣列中。 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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988100/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- https多執行緒下載程式碼HTTP執行緒
- 多執行緒和多執行緒同步執行緒
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- 編寫執行緒安全的JSP應用程式執行緒JS
- 多執行緒下載工具 NeatDownloadManager下載執行緒
- 多執行緒下載檔案執行緒
- ftp多執行緒下載工具FTP執行緒
- Java多執行緒下載分析Java執行緒
- 併發-0-同步/非同步/阻塞/非阻塞/程式/執行緒非同步執行緒
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- java 多執行緒 –同步Java執行緒
- java 多執行緒 --同步Java執行緒
- pytest(13)-多執行緒、多程式執行用例執行緒
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 伺服器模型——從單執行緒阻塞到多執行緒非阻塞(下)伺服器模型執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- 多執行緒下載原理解析執行緒
- 多執行緒斷點下載原理執行緒斷點
- Chrome 開啟多執行緒下載Chrome執行緒
- pytest多程式/多執行緒執行測試用例執行緒
- 非同步VS多執行緒非同步執行緒
- Android原生下載(下篇)多檔案下載+多執行緒下載Android執行緒
- 使用Python編寫一個多執行緒的12306搶票程式Python執行緒
- C#多執行緒(4):程式同步Mutex類C#執行緒Mutex
- 多執行緒(2)-執行緒同步條件變數執行緒變數
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- C#多執行緒開發-執行緒同步 02C#執行緒
- 程式與執行緒、同步與非同步、阻塞與非阻塞、併發與並行執行緒非同步並行
- 多執行緒,多程式執行緒
- 強推!多執行緒下載工具 NeatDownloadManager執行緒
- 【Java】【多執行緒】同步方法和同步程式碼塊、死鎖Java執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- VC編寫多執行緒sql盲注工具.doc執行緒SQL
- Dart 非同步與多執行緒Dart非同步執行緒
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒