如何使计时器逐步取代progressbar.value

时间:2016-03-31 12:19:37

标签: vb.net

好吧,这可能有点难以解释,但我们走了。

简介:

我正在计算9个频道的文件。每个通道基本上都是一个路径(Like \ server \ share \ folder)。现在我有一个计时器和进度条。当progressbar.value = 10时,正在搜索channel 1。正在搜索When progressbar.value = 20channel 2(通过搜索i计算指定路径中的文件)。依此类推。一旦价值100,它将循环回到值1并重新开始。

这个问题是,频道中的一些路径有很多文件,所以它需要一些时间才能完成它似乎会使程序在遇到progressbar.value时出现滞后现象。有许多文件的频道被挂钩。

我在寻找什么:

所以我不想要一个基于其间隔计数的计时器,然后一切都依赖于它。我想要计算频道,然后当它完成时我想继续下一个频道。基本上是这样的:Channel 1, counting, complete, moving to channel 2. Channel 2, counting, complete, moving to channel 3.所以...但它必须准确和受控制。因此,每个频道应使用最小一秒钟。

是的,我不希望它经常被计算在内。它应该计算每个通道直到完成,但如果在非常短的时间内完成(例如5毫秒) - 仍然等待一秒钟左右然后继续到下一个通道。为了做到这一点,我尝试了一些东西,但没有一个像我想要的那样。进一步了解。

这里的计数器位于timermain.tick

之内
pbMain.Increment(1)
                                     'Channel 1
     If cbc1.Checked = True Then
        If pbMain.Value = 10 Then
            Try
                Dim fileTotal As Integer
                For Each item As String In lbChannel1.Items
                    fileTotal += My.Computer.FileSystem.GetFiles(item.ToString, FileIO.SearchOption.SearchTopLevelOnly, (tbExt1.Text)).Count
                Next
                tbCount1.Text = String.Format("{0}", fileTotal.ToString)
            Catch ex As Exception
                lbErrors.Items.Add(String.Concat(TimeOfDay & " Error 001: ", ex.Message)) 'Error output

            End Try
            Dim tCount As Integer = 0
        End If
    End If
                                      'Channel 2
    '... same as above. Then channel 3, 4, 5, 6, 7, 8 and 9...

你会注意到pbmain.value = 10 then这是我一直在讨论的进度条。 lbchannel1.items是一个频道,它是一个列表框,路径为项目。对于所有9个频道重复此操作,但其他频道为pbmain.value 20,30,40,50,60,70,80和90,而上面的代码中的值为10。

问题:

我该如何做但不使用progressbar.value作为激活频道计数的方法?这不是很准确。

发布问题后,我tried performstepthread.sleep ++。看看更新。

PS:我不需要进度条。它没有视觉效果。

更新#1:

而不是pbmain.increment(1)我试图在每个频道之间添加一个pbmain.performstep(),因此它很重要,当它完成时,它会跳到下一个频道并进行计数。可以工作,但它根本不受控制,它就像疯了一样循环。所以这一点,但以某种方式控制将是伟大的。它不应该在每个通道之间使用毫秒,而是大约一秒钟。该应用程序应该被控制,而不是经常。

更新#2:

在评论中获得了Plutonix的提示,尝试我正在尝试的progressbar Marquee模式。

更新#3:

我在每次计数之间尝试过Thread.sleep,但它似乎很糟糕地冻结了程序。

1 个答案:

答案 0 :(得分:1)

我会这样做,请参阅代码内的评论...

Private Sub CheckChannels()
  'We will run through each Channel
  For Channel = 1 to 9
    Dim Cbox = CType(Controls.Find("cbc" & Channel, True).FirstorDefault(), CheckBox)
    'That will work if the 9 checkboxes names are cbcX
    If Cbox.Checked = True Then
      Try
        Dim fileTotal As Integer
        'If we have files in the ListBox
        'Again, the listboxes names must be lbChannelX
        If CType(Controls.find(("lbChannel" & Channel), True).FirstorDefault(), ListBox).Items.Count > 0 Then
          'We run through each item in ListBox
          For Each item As String In CType(Controls.Find("lbChannel" & Channel, True).FirstorDefault(), ListBox).Items
            'We count the files
            fileTotal += My.Computer.FileSystem.GetFiles(item.ToString, FileIO.SearchOption.SearchTopLevelOnly, (CType(Controls.Find("tbExt" & Channel, True).FirstorDefault(), TextBox).Text)).Count
          Next
          'We update the count for that channel
          CType(Controls.Find("tbCount" & Channel, True).FirstorDefault(), TextBox).Text = String.Format("{0}", fileTotal.ToString)
        Else
          'We have no files in that channel, we can do Thread.Sleep(1000)
        End If
      Catch ex As Exception
        'Error output
        lbErrors.Items.Add(String.Concat(TimeOfDay & " Error 00" & Channel & " : ", ex.Message)) 
      End Try
      'I don't know what's the use of this var
      Dim tCount As Integer = 0
    End If
  Next
End Sub