Benutzer mit den meisten Antworten
Wie halte ich mehrmals einen Thread an

Frage
-
Mein Problem ist, dass ich nicht weiß, wie ich einen Thread mehrmals anhalten kann.
Was ich schon ausprobiert habe, aber nicht funktioniert hat, ist, dass ich zwei Befehle habe und zwischen diesen beiden Befehlen ein Thread.Sleep() gesetzt:
Button1.Text = "Befehl 1 wurde leider nicht ausgeführt"
Thread.Sleep(400)
Button1.Text = "Jetzt wird der Zweite aber ausgeführt"
Gruß Krock
Antworten
-
Hallo,
Mein Problem ist, dass ich nicht weiß, wie ich einen Thread mehrmals anhalten kann.
Was ich schon ausprobiert habe, aber nicht funktioniert hat, ist, dass ich zwei Befehle habe und zwischen diesen beiden Befehlen ein Thread.Sleep() gesetzt:
Button1.Text = "Befehl 1 wurde leider nicht ausgeführt"
Thread.Sleep(400)
Button1.Text = "Jetzt wird der Zweite aber ausgeführt"
Das funktioniert schon. Du siehst nur nicht, dass es funktioniert, da Dein Haupt(GUI)thread durch das Thread.Sleep daran gehindert wird, die Änderungen am Button1.Text neu zu zeichnen. Hier kann ein Button1.Refresh helfen oder worst case Application.DoEvents.
Generell sollte man aber den Hauptthread nach Möglichkeit nicht "schlafen" legen, da Windows sonst schnell meint, dass das Fenster nicht mehr reagiert und dem Anwender empfiehlt die Anwendung zu beenden. Besser man lagert solche Aktionen in einen separaten Thread aus.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 3. Februar 2011 16:46
- Als Antwort markiert krock derAhnungslose Donnerstag, 3. Februar 2011 18:35
-
Es gibt komplexe Objekte, deren Eigenschaften nicht aus einem anderen threadmodifiziert werden dürfen, da in solchen Fall die Integrität des Objekteszerstört werden könnte. Zu solchen Objekten gehören auch die Steuerelementeeiner Windows-Oberfläche. Zugriffe auf solche Objekte müssen im Context desthreads ausgeführt werden, der Eigentümer (Erzeuger) des Objektes ist. Dashört sich kompliziert an, ist aber sehr einfach mittels Steuerelement.Invokemöglich. Schau Dir mal den Beitrag auf meiner Homepage dazu an:<Tipps und Tricks - informtools - Tipp 233>--Viele GrüßePeter
- Bearbeitet Thorsten DörflerModerator Samstag, 5. Februar 2011 10:26 URL als Link
- Als Antwort markiert krock derAhnungslose Samstag, 5. Februar 2011 12:14
Alle Antworten
-
Hallo,
Mein Problem ist, dass ich nicht weiß, wie ich einen Thread mehrmals anhalten kann.
Was ich schon ausprobiert habe, aber nicht funktioniert hat, ist, dass ich zwei Befehle habe und zwischen diesen beiden Befehlen ein Thread.Sleep() gesetzt:
Button1.Text = "Befehl 1 wurde leider nicht ausgeführt"
Thread.Sleep(400)
Button1.Text = "Jetzt wird der Zweite aber ausgeführt"
Das funktioniert schon. Du siehst nur nicht, dass es funktioniert, da Dein Haupt(GUI)thread durch das Thread.Sleep daran gehindert wird, die Änderungen am Button1.Text neu zu zeichnen. Hier kann ein Button1.Refresh helfen oder worst case Application.DoEvents.
Generell sollte man aber den Hauptthread nach Möglichkeit nicht "schlafen" legen, da Windows sonst schnell meint, dass das Fenster nicht mehr reagiert und dem Anwender empfiehlt die Anwendung zu beenden. Besser man lagert solche Aktionen in einen separaten Thread aus.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 3. Februar 2011 16:46
- Als Antwort markiert krock derAhnungslose Donnerstag, 3. Februar 2011 18:35
-
Hallo, hier ist noch einmal Krock.
Danke für den Tipp mit Refresh(), nun wird der Button ohne Probleme mit einer neuen Texteigenschaft, auch grafisch bestückt.
Aber auf was ich noch einmal zurückkommen wollte ist folgendes:
-Du meintest es sei besser für eine Windows- Application, wenn man diesen Thread in einen seperaten Thread startet. Das klappt bei mir aber nicht. Es wird immer, wenn ich einen Versuch wage, meine Applikation beendet und eine Ausnahme gekennzeichnet.
Die lautete: "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Button1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."
Hier ist der dazugehörige Quellcode, den ich so konstruierte, dass er nicht funktionierte:
Imports System.Threading
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim neuerThread1 As New Thread(AddressOf der_ultimative_extra_Thread1)
Dim neuerThread2 As New Thread(AddressOf der_ultimative_extra_Thread2)
neuerThread1.Start()
Thread.Sleep(900)
neuerThread2.Start()
End Sub
Sub der_ultimative_extra_Thread1()
Button1.Refresh()
Button1.Text = "Hallo12"
End Sub
Sub der_ultimative_extra_Thread2()
Button1.Text = "Hallo"
End Sub
End ClassWas habe ich falsch gemacht?
Bedanke mich für Antwort schonmal im Vorraus.
Gruß Krock
-
Es gibt komplexe Objekte, deren Eigenschaften nicht aus einem anderen threadmodifiziert werden dürfen, da in solchen Fall die Integrität des Objekteszerstört werden könnte. Zu solchen Objekten gehören auch die Steuerelementeeiner Windows-Oberfläche. Zugriffe auf solche Objekte müssen im Context desthreads ausgeführt werden, der Eigentümer (Erzeuger) des Objektes ist. Dashört sich kompliziert an, ist aber sehr einfach mittels Steuerelement.Invokemöglich. Schau Dir mal den Beitrag auf meiner Homepage dazu an:<Tipps und Tricks - informtools - Tipp 233>--Viele GrüßePeter
- Bearbeitet Thorsten DörflerModerator Samstag, 5. Februar 2011 10:26 URL als Link
- Als Antwort markiert krock derAhnungslose Samstag, 5. Februar 2011 12:14