Forum: PC-Programmierung Label in For-Schleife bei VB2010


von VB-MD (Gast)


Lesenswert?

Guten Morgen,
ich habe ein Problem mit der FOR-Schleife von VisualBasic2010.
Ich möchte bei Erreichen eines bestimmten Wertes der Laufvariablen diese 
bei einem Label anzeigen. Hier der Minimalcode (Rest schon entfernt!):

Public Class Form1
    Shared i As Short

    Private Sub Button1_Click(sender As System.Object, e As 
System.EventArgs) Handles Button1.Click
        For i = 0 To 100
            If i = 67 Then
                Label2.Text = "67"
            End If
            Debug.Print(i)
            System.Threading.Thread.Sleep(100)
        Next
    End Sub

End Class

Das Programm soll mir beim Erreichen von i=67 eine "67" ins Label2 
schreiben.
Die FOR-Schleife wird einfach mit dem Button1 gestartet.
Beim erreichen von 67 ist die Schrift im Label2 nur noch halb zu sehen 
und erst am Ende der Schleife steht im Label2 die 67 drin! Wenn ich in 
den Eigenschaften den Wert AutoSize auf False ändere bleibt zumindest 
die Schrift im Label2 bis zum Ende vollständig erhalten.
Warum???
Eigentlich wollte ich im Label2 den Wert von i beim Durchlauf anzeigen 
lassen.
Schönen Pfingstmontag noch
J.

von MWS (Gast)


Lesenswert?

Label2.Text = "67"
Label2.Refesh

Ggf. nennt sich's auch  Label2.Update, da musst Du in den Methoden zu 
Label nachsehen.

von honko (Gast)


Lesenswert?

probier mal Label2.update
oder DoEvents
oder in der Richtung weiter gurgeln...

von Michael D. (nospam2000)


Lesenswert?

VB-MD schrieb:
> Eigentlich wollte ich im Label2 den Wert von i beim Durchlauf anzeigen
> lassen.

Solange du mit deiner Schleife den Main Thread blockierst, kann das 
Betriebssystem nichts zeichnen. Daher nimmt man bei länger laufenden 
Aktionen Worker Threads. Siehe hier: 
https://en.wikipedia.org/wiki/Thread_(computing)#Multithreading
Alternative Lösungen ohne eigenen Thread wurden bereits genannt, ich 
wollte dir eigentlich nur das Problem verdeutlichen.

Bei kurzen Aktionen wie beim Zählen auf 100 sollte das eigentlich so 
schnell gehen, dass man garnicht bemerkt, dass die Oberfläche kurzzeitig 
eingefroren ist.

Zu welcher Kategorie Dein Programm gehört hängt davon ab, was du in der 
Schleife wirklich machst.

Den Main Thread mit einem Sleep zu blockieren ist nicht nett gegenüber 
dem restlichen Programm, dafür nimmt man eher Timer und lässt sich nach 
jeweils 100ms benachrichtigen.

  Michael

: Bearbeitet durch User
von VB-MD (Gast)


Lesenswert?

Danke Michael,
wie Du schon vermutest, ist die Schleife eigentlich mein Haptprogramm. 
Sie zählt dann bis 4097 und gibt jedesmal über die COM1 zwie Zeichen an 
einen ATMega32. Deshalb auch der Sleep-Befehl damit die serielle 
Schnittstelle mitkommt. Ich wollte bloß dabei sehen wie weit der Prozess 
schon ist! Bisher sehe ich dies nur im Direktfenster.

von Alexander K. (Gast)


Lesenswert?

VB-MD schrieb:
> If i = 67 Then
>    Label2.Text = "67"
     My.Application.DoEvents()  <-------------- DAS da rein, und gut 
ist.
>   End If

Refresh't die ganze Form, nicht nur den Label.

Gruß

   Pucki

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.