我写的程序需要在Oracle上存取图片,但如何网速慢的话程序在从数据库上获取图片的过程中程序会出现假死的状态,于是我用一个进度条来显示图片数据的获取进度,可由于程序获取图片时已经处于假死状态,进度条也不会跟进,怎么办呢?
该如何解决呢?非常感谢,下面是程序代码
==========================================
  '从数据库获取图片
  Private Sub GetPicture()
          Dim DataFile  As Integer
          Dim Fl        As Long
          Dim Chunks    As Integer
          Dim Fragment  As Integer
          Dim Chunk()   As Byte
          Dim i         As Integer
          Const ChunkSize    As Integer = 16384         '块缓存大小
          Dim rs        As Recordset
          
          On Error GoTo What2Do
          
          Set rs = New ADODB.Recordset
          
          rs.Open "select Picture from YC_PIM_HYD_PROTECTION where Code = " & CurrentCode, cnnDB, adOpenDynamic, adLockOptimistic
     
          DataFile = 1
          Open App.path & "\pictemp." & CurrentFileExtension For Binary Access Write As DataFile
          
          Fl = rs!Picture.ActualSize
          Chunks = Fl \ ChunkSize
          Fragment = Fl Mod ChunkSize
          ReDim Chunk(Fragment)
          Chunk() = rs!Picture.GetChunk(Fragment)
          Put DataFile, , Chunk()          For i = 1 To Chunks
             ProgressBar1.Value = i / Chunks * ProgressBar1.Max
             ReDim Buffer(ChunkSize)
             Chunk() = rs!Picture.GetChunk(ChunkSize)
             Put DataFile, , Chunk()
          Next i          ProgressBar1.Value = ProgressBar1.Max
          Close DataFile
     
          CurrentPicturePath = App.path & "\pictemp." & CurrentFileExtension
          ShowPicture
          
          Exit Sub
  What2Do:
     MsgBox ("从服务器下载图片错误!")
     Exit Sub
  End Sub

解决方案 »

  1.   

    我试着把 DoEvents 放在循环中
    可为什么还不行呢?
      

  2.   

    服务器是远程的SQL还是本地的ACCESS?
    如果是SQL的话,可能网络状态不理想,程序假死在连接服务器上面了!
      

  3.   

              ProgressBar1.Max = Chunks
              ProgressBar1.Value = 0
              ProgressBar1.Refresh          For i = 1 To Chunks 
     
                ReDim Buffer(ChunkSize) 
                Chunk() = rs!Picture.GetChunk(ChunkSize) 
                Put DataFile, , Chunk() 
                ProgressBar1.Value = i
                ProgressBar1.Refresh          Next i           ProgressBar1.Value = ProgressBar1.Max 
      

  4.   

    问题已经搞明白了,获取数据的过程是在
    rs.Open "select Picture from YC_PIM_HYD_PROTECTION where Code = " & CurrentCode, cnnDB, adOpenDynamic, adLockOptimistic
     
    而不是
              For i = 1 To Chunks
                ProgressBar1.Value = i / Chunks * ProgressBar1.Max
                ReDim Buffer(ChunkSize)
                Chunk() = rs!Picture.GetChunk(ChunkSize)
                Put DataFile, , Chunk()
              Next i 所以程序假死在rs.open语句,而不是后者,那如何才能让程序获取数据的时候获取进度呢?