2023年1月31日星期二

VB6多線程執行Get請求(基於Curl庫)

VB6多線程執行Get請求(基於Curl庫)

HTTPClient_Multi_Get系列函數

說明

基於Curl庫,多線程Get方法請求內容。
支持http和https協議。
支持gzip、 deflate 、br自動解壓持續使用內存會不斷增長,達到一定峰值後不會繼續增長,使用完後內存自動回收支持返迴響應頭支持設置超時時間

參數

HTTPClient_Multi_New
MultiObj:多線程管理對象
MaxThreads:最大線程數

HTTPClient_Multi_AddGetTask
MultiObj:多線程管理對象
CurlTask:任務對象
URL:網址,支持http和https
RequestHeaders:向網址發起的請求頭
IsUTF8:是否是UTF8編碼。 0-非UTF8編碼,1-UTF8字符
ConnectTimeOut:連接超時時間,單位秒
TimeOut:總超時時間,單位秒
ResponseAuto Decode :是否自動解碼返回內容。比如IsUTF8=1時,自動將UTF8結果字符解碼為Ansi字符

HTTPClient_Multi_IsFinish
MultiObj:多線程管理對象
OK_Task:成功的任務對象
StrErr:錯誤信息

HTTPClient_Multi_GetResponse
CurlTask:任務對象
ResponseHeaders:請求後得到的響應頭

HTTPClient _Multi_TaskFree
MultiObj:多線程管理對象
CurlTask:任務對象


HTTPClient_Multi_Free
MultiObj:多線程管理對象

引用

Public Declare Function HTTPClient_Multi_New Lib "VB6Net.dll" (ByRef MultiObj As Long, Optional ByVal MaxThreads As Integer = 10) As String
Public Declare Function HTTPClient_Multi_AddGetTask Lib "VB6Net.dll" (ByRef MultiObj As Long, ByRef CurlTask As Long, ByRef URL As String, Optional ByRef Request Headers As String = "", Optional ByVal IsUTF8 As Integer = 1, Optional ByVal ConnectTimeOut As Integer = 5, Optional ByVal TimeOut As Integer = 60, Optional ByVal ResponseAutoDecode As Integer = 1) As String
Public Declare Function HTTPClient_Multi_IsFinish Lib "VB6Net.dll" (ByRef MultiObj As Long, ByRef OK_Task As Long, ByRef StrErr As String) As Boolean
Public Declare Function HTTPClient_Multi_GetResponse Lib "VB6Net.dll" (ByRef CurlTask As Long, Optional ByRef ResponseHeaders As String = "") As String
Public Declare Sub HTTPClient_Multi_TaskFree Lib "VB6Net.dll" (ByRef MultiObj As Long, ByRef CurlTask As Long)
Public Declare Sub HTTPClient_Multi_Free Lib "VB6Net.dll" (ByRef MultiObj As Long)

封裝UserControl後的使用示例

Dim Multi_Tasks() As String
Dim Multi_IsFinish As Boolean


Sub DoTask()
ReDim Multi_Tasks(2, 4)

Multi_Tasks(1, 1) = "https://www.baidu.com/"
Multi_Tasks(2, 1) = "1"
Multi_Tasks(1, 2) = "https://www.qq.com/"
Multi_Tasks(2, 2) = "0"
Multi_Tasks(1, 3) = "https://www.iqiyi.com/"
Multi_Tasks(2, 3) = "1"
Multi_Tasks(1, 4) = "https://www.sina.com.cn/"
Multi_Tasks(2, 4) = "1"

Multi_IsFinish = False
With MultiNet1 'MultiNet1是封裝的UserControl 詳見示例
.Multi_ThreadMax = 4
For i = 1 To UBound(Multi_Tasks, 2)
.AddGetTask Multi_Tasks(1, i), , Multi_Tasks(2, i)
Next
.Start
End With

Do While Multi_IsFinish = False
Do Events
Loop

ShowLog "執行完畢"

End Sub

Private Sub MultiNet1_OnFinish(ByVal Msg As String)
Multi_IsFinish = True
ShowLog Msg
End Sub


Private Sub MultiNet1_OnTaskFinish(ByVal TaskIndex As Integer, ByVal Thread Index As Integer, ByVal ThreadAddr As Long, ResponseHeaders As String , ResponseBody As String)
ShowLog "線程" & ThreadIndex & "(" & ThreadAddr & "):執行完畢" & vbTab & " √ " & TaskIndex & "-" & Multi_Tasks(1, TaskIndex) & vbTab & VBA .Left(ResponseBody, 200) & ".." & vbCrLf
End Sub

例子




運行結果


没有评论:

发表评论

在連城訣中為什麼戚長髮最窮?

以 戚長髮 的計謀水平和做人手段,他不可能窮的。 戚長發 之所以 看起來窮 , 之所以一直過著窮日子 ,第一是因為他太聰明了,誰知 「聰明反被聰明誤」 ;第二是因為他偽裝憨厚老實偽裝得太成功了,結果, 「 假老實碰上了真質樸」 ,把他困住了。 用成語來說就是"弄巧成...