大量數據處理里使用進度條顯示進度,但如何避免進度條拖慢處理時間呢

2020-01-03 08:00:00
zstmtony
原創
57

最近幫一個客戶在處理一個業務時,因為處理時間長,為了避免客戶焦慮等待,在處理過程中添加了進度條,但因為記錄數特別多,達幾十萬,增加進度條顯示后,會導致處理時間成倍增加。拖慢了處理的速度,反而背離了之前的初衷。所以在顯示進度條時想了一個辦法,不是每條都刷新進度條,而是以一定的間隔如100 1000 10000 這樣的等級間隔來刷新進度條,數據量越大,間隔長度越長,這樣就在處理時間及顯示進度條之間取得一個平衡,既顯示了進度,但不會拖慢整個處理時間。





Public Sub 生成3個號和值振幅表()
    Dim rst         As Object           '子窗體記錄集
    Dim rstTmp         As Object           '子窗體記錄集
    Dim He123, He124, He125, He234, He235, He345, He134, He135, He145, He245 As Integer
    
    Set rstTmp = CurrentDb.OpenRecordset("TMP_tbl最后一期數據表", dbOpenDynaset)
        rstTmp.MoveFirst
        '把當前記錄的數據保存在變量,用于計算所有組合的振幅
        He123 = rstTmp![123和]
        He124 = rstTmp![124和]
        He125 = rstTmp![125和]
        He234 = rstTmp![234和]
        He235 = rstTmp![235和]
        He345 = rstTmp![345和]
        He134 = rstTmp![134和]
        He135 = rstTmp![135和]
        He145 = rstTmp![145和]
        He245 = rstTmp![245和]
    rstTmp.Close
    Set rstTmp = Nothing
    
    
    
        
    CurrentDb.Execute "delete * from tbl3個號和值振幅表"
    
    Set rst = CurrentDb.OpenRecordset("tbl3個號和值振幅表", dbOpenDynaset)
    Set rstTmp = CurrentDb.OpenRecordset("tbl3個號和庫", dbOpenDynaset)
    If rstTmp.RecordCount = 0 Then Exit Sub
    
    
    
    
    
    
    '初始化進度條
    '記錄集先移到最后,以避免總條數取不對
    rstTmp.MoveLast
    rstTmp.MoveFirst Dim lngCnt As Long
    Dim i As Long
    lngCnt = rstTmp.RecordCount  '取記錄的總數
    Dim clsProgress As New clsSysProgress
    Dim lngSplit As Long
    
    lngSplit = Int(lngCnt / 100)
    If lngSplit <= 0 Then lngSplit = 1

    clsProgress.gintStep = 1
    clsProgress.gintLong = lngCnt
    clsProgress.gintTime = 20
    clsProgress.gf_ChangeText "準備生成3個號和值振幅表 ..."
    clsProgress.gf_Show PM_Wait Do Until rstTmp.EOF
    
        '記錄數比較大時,則隔一段時間才更新進度條,而不是每條都更新進度條,大大加快速度
        i = i + 1
        If i Mod lngSplit = 0 Or i = lngCnt Then
            clsProgress.gf_ChangeText "正在生成3個號和值振幅表-- 第" & i & "條/共" & lngCnt & "條 ..."
            clsProgress.gf_SetStep i
            DoEvents
        End If
        
        
        rst.AddNew
        rst!組合ID = rstTmp!組合ID
        rst!組合 = rstTmp!組合
        
        rst![123振幅] = Abs(rstTmp![123和] - He123)
        rst![124振幅] = Abs(rstTmp![124和] - He124)
        rst![125振幅] = Abs(rstTmp![125和] - He125)
        rst![234振幅] = Abs(rstTmp![234和] - He234)
        rst![235振幅] = Abs(rstTmp![235和] - He235)
        rst![345振幅] = Abs(rstTmp![345和] - He345)
        rst![134振幅] = Abs(rstTmp![134和] - He134)
        rst![135振幅] = Abs(rstTmp![135和] - He135)
        rst![145振幅] = Abs(rstTmp![145和] - He145)
        rst![245振幅] = Abs(rstTmp![245和] - He245)
        
        rst.Update
        rstTmp.MoveNext
    Loop
    
    '關閉進度條 處理完成
    clsProgress.gf_ChangeText "3個號和值振幅表 處理完成!"  '完成
    Set clsProgress = Nothing
 
 
    
    rst.Close
    rstTmp.Close
    Set rst = Nothing
    Set rstTmp = Nothing
分享
北京十一选五基本走势