请教高手:以下是个VB的多线程下载示例.这个程序只有一个窗体.程序体如下: Dim dn(6) As Boolean '用于记录每个线程是否已完成下载任务 Dim DnPos(6) As Long '记录每个线程下载的结束点 Dim DnPos1(6) As Long '记录每个线程当前下载位置 Dim ThreadCount As Long '记录线程数量 Dim GetInfoed As Boolean '第一个线程负责在OnGetData事件中获取文件体积等信息,GetInfoed用于记录是否已获得了信息 Dim RealUrl As String '记录要下载的文件地址
Function jfMinValue(ByVal a As Long, ByVal b As Long) As Long '取最小值 If a > b Then jfMinValue = b Else jfMinValue = a End Function
Private Sub AddMessage(ByVal S As String, ByVal Size As Long, ByVal Color As Long) 'RichTextBox1.SetFocus RichTextBox1.SelStart = Len(RichTextBox1.Text) RichTextBox1.SelFontSize = Size RichTextBox1.SelColor = Color RichTextBox1.SelText = S & vbCrLf RichTextBox1.SelStart = Len(RichTextBox1.Text) End Sub
Private Sub FreeThreads() For i = 1 To ThreadCount - 1 Unload jfDownloadX1(i) Next For i = 0 To 5 dn(i) = False DnPos1(i) = 0 Next
Private Sub CheckEnd() For i = 0 To ThreadCount - 1 If Not dn(i) Then Exit Sub Next MsgBox "文件下载完成。", 64 Label3.Caption = "就绪"
End Sub
Function GetAllPos() As Long GetAllPos = jfMinValue(DnPos1(0), DnPos(0)) For i = 1 To ThreadCount - 1 If DnPos1(i) >= DnPos(i - 1) Then GetAllPos = GetAllPos + jfMinValue(DnPos1(i), DnPos(i)) - DnPos(i - 1) End If Next End Function
Private Sub Command1_Click() jfDownloadX1(0).SaveFileName = Right(Text1.Text, Len(Text1.Text) - InStrRev(Text1.Text, "/")) If jfDownloadX1(0).ShowSaveDlg Then FreeThreads GetInfoed = False ThreadCount = Combo1.ListIndex + 1 jfDownloadX1(0).UseReferer = True jfDownloadX1(0).Referer = Left(Text1.Text, InStrRev(Text1.Text, "/")) RealUrl = Text1.Text jfDownloadX1(0).DownFile RealUrl, jfDownloadX1(0).SaveFileName, 0, True End If
End Sub
Private Sub Form_Load() Combo1.ListIndex = 2 End Sub
Private Sub jfDownloadX1_OnError(Index As Integer, ByVal ErrorID As Long, ByVal ErrorMessage As String)
If ErrorID = 3 Or ErrorID = 500 Or ErrorID = 503 Or ErrorID = 10038 Or ErrorID = 10060 Then '如果是一些问题不大的错误,则进行重试下载,当然还有一些错误也可以重试,这里只列举5个 AddMessage "断开连接,重新从断点处续传文件...", 9, 0 jfDownloadX1(Index).CloseLink jfDownloadX1(Index).DownFile RealUrl, jfDownloadX1(0).LocalFile, DnPos1(Index), True Else AddMessage "断开连接,第 " & Str(Index + 1) & " 个线程下载文件失败!", 12, RGB(255, 0, 0) jfDownloadX1(Index).CloseLink End If
End Sub
Private Sub jfDownloadX1_OnGetData(Index As Integer) If jfDownloadX1(Index).FileLength <= 0 Then Exit Sub If Not GetInfoed Then GetInfoed = True CreateThreads End If DnPos1(Index) = jfDownloadX1(Index).Progress Label3.Caption = "正在下载 " & Str(GetAllPos) & "/" & Str(jfDownloadX1(Index).FileLength) & " ..." If jfDownloadX1(Index).Progress >= DnPos(Index) Then jfDownloadX1(Index).CloseLink dn(Index) = True AddMessage "第 " & Str(Index + 1) & " 个线程下载任务完成。", 12, RGB(0, 0, 255) CheckEnd End If
End Sub
Private Sub jfDownloadX1_OnKilllink(Index As Integer) AddMessage "第 " & Str(Index + 1) & " 个线程已断开连接。", 9, RGB(255, 0, 0) End Sub
Private Sub jfDownloadX1_OnLinked(Index As Integer) AddMessage "第 " & Str(Index + 1) & " 个线程已连接到服务器。", 9, 0 End Sub
Private Sub jfDownloadX1_OnMessage(Index As Integer, ByVal MsgStr As String, ByVal MsgType As Long) Select Case MsgType 'MsgType的值为1时,表示是向服务器传输的信息,值为2时表示是服务器返回的信息,值为0时为其它注释信息 Case 1 AddMessage MsgStr, 9, RGB(0, 0, 128) Case 2 AddMessage MsgStr, 9, RGB(0, 128, 0) Case Else AddMessage MsgStr, 9, 0 End Select End Sub
Private Sub jfDownloadX1_OnReSetURL(Index As Integer, Url As String) RealUrl = Url End Sub 窗体上面有一个文本框控件用于输入完整的网络地址.我想请教各位:如果我想做个两个窗体的程序,让这个多线程的程序根据第二个窗体上的文本框中的内容进行下载,应该怎么修改呢? 另外,这个程序我实在有些看不懂.我想知道在哪里是多线程下载的功能代码块?哪一块是把文件分割成块的语句块呢? 在Private Sub jfDownloadX1_OnReSetURL(Index As Integer, Url As String) RealUrl = Url End Sub 这个事件过程中的realurl=url里边,这个url的内容是什么呢?它应该是个字符型的变量阿?但在程序中我并没有看到在哪里有给这个url变量赋值的语句阿?