none
Wie halte ich mehrmals einen Thread an RRS feed

  • 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

    Donnerstag, 3. Februar 2011 14:11

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
    Donnerstag, 3. Februar 2011 14:48
    Moderator
  • Es gibt komplexe Objekte, deren Eigenschaften nicht aus einem anderen thread
    modifiziert werden dürfen, da in solchen Fall die Integrität des Objektes
    zerstört werden könnte. Zu solchen Objekten gehören auch die Steuerelemente
    einer Windows-Oberfläche. Zugriffe auf solche Objekte müssen im Context des
    threads ausgeführt werden, der Eigentümer (Erzeuger) des Objektes ist. Das
    hört sich kompliziert an, ist aber sehr einfach mittels Steuerelement.Invoke
    möglich. Schau Dir mal den Beitrag auf meiner Homepage dazu an:
     
    <Tipps und Tricks - informtools - Tipp 233>
     
    --
    Viele Grüße
    Peter
     
     
    Samstag, 5. Februar 2011 06:53

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
    Donnerstag, 3. Februar 2011 14:48
    Moderator
  • 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 Class

     

    Was habe ich falsch gemacht?

    Bedanke mich für Antwort schonmal im Vorraus.

    Gruß Krock

     

    Freitag, 4. Februar 2011 16:44
  • Es gibt komplexe Objekte, deren Eigenschaften nicht aus einem anderen thread
    modifiziert werden dürfen, da in solchen Fall die Integrität des Objektes
    zerstört werden könnte. Zu solchen Objekten gehören auch die Steuerelemente
    einer Windows-Oberfläche. Zugriffe auf solche Objekte müssen im Context des
    threads ausgeführt werden, der Eigentümer (Erzeuger) des Objektes ist. Das
    hört sich kompliziert an, ist aber sehr einfach mittels Steuerelement.Invoke
    möglich. Schau Dir mal den Beitrag auf meiner Homepage dazu an:
     
    <Tipps und Tricks - informtools - Tipp 233>
     
    --
    Viele Grüße
    Peter
     
     
    Samstag, 5. Februar 2011 06:53