Codes hintereinander ausführen

Hi allezusammen,
Ich habe vor 2 Wochen angefangen mit VB 2008 zu pogrammieren, also bin ich ein ziemlicher Anfänger!
Meine Frage: Ist es möglich Befehle oder Codes einzugeben die der Pc dann genau in der Reihenfolge wiedergibt?

Hier mein Beispiel:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
System.Threading.Thread.Sleep(2000)
Button2.Text = „Test 1“
System.Threading.Thread.Sleep(2000)
Button2.Text = „Test 2“
End Sub

Ich will dass, wenn man auf den button1 klickt, dass

  1. eine 2 Sekunden-Pause kommt dann
  2. der text des button2 „Test 1“ wird dann
  3. wieder eine 2 Sekunden Pause kommt und dann
  4. der Text sich wieder ändert: in „Test 2“.

Wenn ich das so mache wie oben, wartet der Pc 4 Sekunden und dann wird der Text vom button2 „Test 2“

Danke schonmal im vorraus!

Hallo!
Der Code, den Du gepostet hast, tut schon das, was da steht (also nacheinander den Text des Buttons 2* ändern), Du siehst es nur nicht.
Eine elementare Tatsache bei der Oberflächenprogrammierung unter Windows ist, dass es genau einen Thread gibt, der für die Darstellung von Steuerelementen zuständig ist (üblicherweise als UI-Thread bezeichnet), die von ihm erzeugt wurden.
Ebenso laufen in diesem Thread auch die Ereignisbehandlungsprozeduren dieser Steuerelemente.
Beim Klick auf den Button passiert also folgendes:

  1. Der UI-Thread wird 2 Sek. schlafen geschickt.
  2. Der Text des Buttons wird im UI-Thread geändert.
  3. Der UI-Thread wird wieder 2 Sek. schlafen geschickt.
  4. Der Text wird ein zweites Mal geändert.
    Dann erst ist die Ereignisbehandlung des Click-Ereignisses fertig und der UI-Thread kann sich seinen sonstigen Aufgaben zuwenden, nämlich die Steuerelemente neu zu zeichnen. Erst zu diesem Zeitpunkt siehst Du den in diesem Moment aktuellen Text auf dem Button.

OK?

Gruß,
Martin

Ergänzend zu Martin Müller’s Antwort:
Du musst also das warten vom UI-Thread unterbinden,
sprich einen zweiten thread erzeugen, der wartet und dem UI-Thread en Befehl zum Ändern der texte gibt.

So ungefähr (sorry, wenn der VB-Code noch ganz korrekt ist, bin C#-ler):
Sub EventMethod()
Dim t As Thread
t = new Thread ’ Als Argument die Methode M übergeben
t.Start()
End Sub

Sub M()
Thread.Sleep(2000)
Button1.BeginInvoke(ThisMethodChangesTheTextProperty, Button1)
Thread.Sleep(2000)
Button2.BeginInvoke(ThisMethodChangesTheTextProperty, Button2)
End Sub

Danke Martin
Jetzt versteh ich das ganze ein bisschen besser, aber ich finde keine Lösung.
Soll ich das system.threading.thread.sleep(2000) durch was anderes ersetzten?
Oder kann man einen zweiten UI-Thread öffnen?
Könnte man es mit mehreren Subs machen?
Schon im vorraus danke
max

Ergänzung
Hier der Code nochmals ausfühlicher und mit behobenen Fehlern:
Sub EventMethod()
Dim t As Thread
t = new Thread(New ThreadStart(MyTextChanger))
t.Start()
End Sub

Sub MyTextChanger()
Thread.Sleep(2000)
Button1.BeginInvoke(ChangeText, New Object() { Button1, „Erster Text“ })
Thread.Sleep(2000)
Button1.BeginInvoke(ChangeText, New Object() { Button1, „Zweiter Text“ })
End Sub

Sub ChangeText(Dim B As Button, Dim S As String)
B.Text = S
End Sub

Man könnte aber auch einen System.Windows.Forms.Timer machen, der bei jedem Tick den Text von Button1 auf den nächsten Index eines String-Arrays setzt und sich bei erreichen des Array-Endes beendet (Enabled = False).

Hallo Max,

Du löst Dein Problem z.B. so:

Private Sub Button1\_Click(ByVal sender As System.Object, \_
 ByVal e As System.EventArgs) Handles Button1.Click
 Button2.Text = "Test 1"
**Application.DoEvents()**
 System.Threading.Thread.Sleep(2000)
 Button2.Text = "Test 2"
End Sub

Gruß
Thomas

Danke,
da währe ich nie drauf gekommen!
Gruß, Max

Hallo!

Application.DoEvents() mag zwar im ersten Moment aussehen, als wäre es „die“ Lösung, aber sauber ist das nicht. Du hast keinerlei Kontrolle darüber, was an Nachrichten abgearbeitet wird (alle) und kommst damit in Teufels Küche, sobald die Anwendung ein bisschen komplexer wird.
Dann erinnert man sich mit hoher Wahrscheinlichkeit nicht mehr daran, irgendwo Application.DoEvents() verwendet zu haben und plötzlich wird irgendwelcher Code ausgeführt, mit dem man nie gerechnet hat („das ist ja in einem anderen Eventhandler…“) oder Du bekommst eine lustige Endlosrekursion!

Die andere vorgeschlagene Lösung mit einem separaten Thread, der die Arbeit macht (in diesem Fall wartet) und den UI-Thread die Ansteuerung der Oberfläche machen lässt, ist auf jeden Fall die vernünftigere Lösung (wenngleich auch für Einsteiger nicht so leicht zu verstehen).

Gruß,
Martin

Hi Martin,
Wie würde so ein neuer Thread denn aussehen, also als Code?
Und was ist der UI-Thread denn genau?
Gruß max

Hallo nochmal!

JasonDelife hat unten ja schon ein Beispiel gepostet, wie das mit mehreren Threads aussehen kann.

Der UI-Thread ist einfach der Thread, in dem Dein (Windows-)Programm ausgeführt wird, wenn Du Dich nicht weiter um Threading kümmerst und nicht selbst weitere Threads erzeugst.
Im Wesentlichen besteht die Hauptaufgabe des UI-Threads darin, eine sog. Message Pump zu betreiben: Jeweils nachzuschauen, ob in seiner Nachrichtenwarteschlange zu verarbeitende Nachrichten sind (z.B. „Neu zeichnen“, „Linke Maustaste wurde an Position xy geklickt“, usw. usf.) und diese an die entsprechenden Stellen weiterleiten, die dann aufgrund der konkreten Nachricht irgendwas machen.

Ein gewisses Problem sehe ich darin, dass VB (auch VB.NET noch) für meinen Geschmack dem Entwickler zu viel abnimmt und somit das Verstehen der Innereien erschwert. Einfache Sachen sind zwar damit schnell hingezimmert, aber wenn man sich für das „warum“ und „wie“ interessiert, tut man sich schwer, weil die interne Verdrahtung zu gut verborgen ist.

Magst Du Dich nicht vielleicht doch mit C# anfreunden? :smiley:

Gruß,
Martin