首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • VB多线程编程的问题 [无满意答案结贴,结贴人:middleschoolstudent]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-04 16:42:43 楼主
    请教高手:以下是个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

    End Sub

    Private Sub CreateThreads()
      DnPos(0) = jfDownloadX1(0).FileLength \ ThreadCount    '定义第一个线程应下载的长度
      For i = 1 To ThreadCount - 1
        Load jfDownloadX1(i)
        jfDownloadX1(i).Height = jfDownloadX1(0).Height
        jfDownloadX1(i).Top = jfDownloadX1(i - 1).Top + jfDownloadX1(i).Height
        DnPos(i) = DnPos(i - 1) + DnPos(0)
        DnPos1(i) = DnPos(i - 1)
        jfDownloadX1(i).Visible = True
        jfDownloadX1(i).UseReferer = True
        jfDownloadX1(i).Referer = jfDownloadX1(0).Referer
        jfDownloadX1(i).DownFile RealUrl, jfDownloadX1(0).LocalFile, DnPos(i - 1), True
      Next
      DnPos(ThreadCount - 1) = jfDownloadX1(0).FileLength

    End Sub

    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)
     
      AddMessage "第 " & Str(Index + 1) & " 个线程发生错误:" & Str(ErrorID) & ":" & ErrorMessage, 12, RGB(255, 0, 0)
     
      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变量赋值的语句阿?

    请高手指点,谢谢!
    20  修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved