2016-03-31 4 views
0

In Ordnung, so könnte dies ein wenig schwer zu erklären, aber hier sind wir.Wie kann ich einen Timer machen Schritt für Schritt anstelle von progressbar.value

Intro:

ich Dateien in 9 Kanäle verlasse mich. Jeder Kanal ist im Grunde ein Pfad (Like \ Server \ Freigabe \ Ordner). Im Moment habe ich einen Timer und eine Fortschrittsleiste. Wenn progressbar.value = 10, wird channel 1 gesucht. When progressbar.value = 20, channel 2 wird gesucht (durchsucht werden die Dateien innerhalb des angegebenen Pfades gezählt). Und so weiter bis zum Wert 100. Bei Wert 100 wird auf den Wert 1 zurückgegangen und neu gestartet.

Das Problem mit diesem, dass einige der Wege, die in den Kanälen sind, eine riesige Menge von Dateien haben, so wird es einige Zeit dauern, bis es fertig ist und es scheint das Programm zu verzögern, wenn es das progressbar.value trifft Der Kanal mit vielen Dateien ist angehängt.

Was ich suche:

So möchte ich nicht einen Timer, der auf das Intervall basierend zählt und dann alles, was sich verlassen. Ich möchte den Kanal zählen, und wenn es vollständig ist, möchte ich zum nächsten Kanal weitergehen. Grundsätzlich so: Channel 1, counting, complete, moving to channel 2.Channel 2, counting, complete, moving to channel 3. Also weiter ... Aber es muss genau und kontrolliert sein. Also sollte jeder Kanal sagen, Minimum eine Sekunde.

Ja, ich will nicht, dass es ständig zählt. Es sollte jeden Kanal bis zur Vollständigkeit zählen, aber wenn in sehr kurzer Zeit (sagen wir zum Beispiel 5 Millisekunden) abgeschlossen ist - warten Sie noch eine Sekunde oder so und fahren Sie dann mit dem nächsten Kanal fort. Um das zu erreichen, habe ich ein paar Dinge ausprobiert, aber keines funktioniert so, wie ich es möchte. Siehe weiter unten.


es hier der Zähler, die

innerhalb timermain.tick ist
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... 

Sie werden die pbmain.value = 10 then bemerken, die die progressbar ich gesprochen haben. Und lbchannel1.items ist der Kanal, der eine Listbox mit Pfaden als Elemente ist. Dies wiederholt sich für alle 9 Kanäle, aber die anderen sind bei pbmain.value 20, 30, 40, 50, 60, 70, 80 und 90, während die in meinem Code oben bei Wert 10 ist.

Die Frage :

Wie kann ich dies tun, aber nicht progressbar.value als eine Möglichkeit, die Zählung für die Kanäle zu aktivieren? Es ist nicht sehr genau.

Nach der Frage geschrieben habe ich tried performstep und thread.sleep ++. Sehen Sie sich die Updates an.

PS: Ich brauche keine Fortschrittsanzeige. Es ist nicht für visuelle Effekte da.


Update # 1:

Statt pbmain.increment(1) ich einen pbmain.performstep() zwischen jedem Kanal hinzuzufügen versucht, so zählt und wenn das ist, füllen Sie springt es zum nächsten Kanal und zählt.Könnte funktionieren, aber es ist überhaupt nicht kontrolliert und damit loopt es wie verrückt. Also das, aber irgendwie kontrolliert wäre toll. Es sollte nicht Millisekunden zwischen jedem Kanal, aber eine Sekunde oder so verwenden. Die Anwendung soll kontrolliert gezählt werden, nicht ständig.

Update # 2:

erhielt ein Spitzen von Plutonix in den Kommentaren progressbar Marquee Modus, um zu versuchen, die ich zur Zeit versuche ich.

Update # 3:

Ich versuchte Thread.sleep zwischen jeder Zählung, aber es scheint wirklich schlecht um das Programm zu gefrieren. unter Verwendung eines für jede Schleife

+0

Sie Arent gehen genau in der Lage sein, um eine progressbar zu erhöhen. Hast du die ProgressBar im Marquee-Modus ausprobiert? – Plutonix

+0

Hmm nein, davon habe ich noch nicht einmal gehört. Ich werde etwas darüber recherchieren. – MadsTheMan

+0

Wenn du sagst: "Ich habe die Fortschrittsleiste ausgeblendet", heißt das, dass die Fortschrittsleiste nicht angezeigt wird? Wenn es nicht sichtbar ist, wozu dann eine Fortschrittsleiste? –

Antwort

1

ich es so machen würde, siehe Kommentare in Code ...

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 
+0

Martin, das ist großartig. Ich kannte die Verwendung von ctype auch nicht. Ich werde es den ganzen Tag testen. Habe es einfach in den Code kopiert und ich bekomme zwei wahrscheinlich einfache Fehler. ** 1) ** Fehlende nächste auf dem For Channel = 1 bis 9 und ** 2) ** auf dem zweiten 'If CType' (für lbchannel). Nur dass es eine Endaussage fehlt. Nur um sicher zu sein, wo würde ich das "Ende wenn" und "das nächste" geben, das fehlt? Außerdem steht der "dim tCount" für etwas anderes im Code. Macht nichts dagegen. :) – MadsTheMan

+0

@MadsTheMan Korrigiert, ersetzen Sie einfach die letzte 'End If' von' Next' –

+0

Aus irgendeinem seltsamen Grund bekomme ich immer noch Fehler auf 'If CType (Controls (" lbChannel "& Channel), ListBox) .Items.Count> 0) Dann diese Zeile. Der Fehler zeigt auf "0)" und sagt "Ende der Anweisung erwartet.". Es sieht aus wie das "For Each" nach dem Start bei "for channel". Ich bin mir nicht sicher, wie ich das erklären soll, aber ich werde meine Antwort auf den neuesten Stand bringen. – MadsTheMan

Verwandte Themen