好吧,这可能有点难以解释,但我们走了。
简介:
我正在计算9个频道的文件。每个通道基本上都是一个路径(Like \ server \ share \ folder)。现在我有一个计时器和进度条。当progressbar.value = 10
时,正在搜索channel 1
。正在搜索When progressbar.value = 20
,channel 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 performstep
和thread.sleep
++。看看更新。
PS:我不需要进度条。它没有视觉效果。
更新#1:
而不是pbmain.increment(1)
我试图在每个频道之间添加一个pbmain.performstep()
,因此它很重要,当它完成时,它会跳到下一个频道并进行计数。可以工作,但它根本不受控制,它就像疯了一样循环。所以这一点,但以某种方式控制将是伟大的。它不应该在每个通道之间使用毫秒,而是大约一秒钟。该应用程序应该被控制,而不是经常。
更新#2:
在评论中获得了Plutonix的提示,尝试我正在尝试的progressbar Marquee
模式。
更新#3:
我在每次计数之间尝试过Thread.sleep,但它似乎很糟糕地冻结了程序。
答案 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