none
VB.NET: Zugriff auf Thread in Endlosschleife

    Frage

  • Hallo,

    ich möchte von einem Thread auf einen anderen zugreifen. Der andere Thread befindet sich in einer Endlosschleife. Kann man jetzt mithilfe eines Dispatchers auf diesen Thread zugreifen (und zum Beispiel eine Prozedur im Endlos-Thread ausführen)?

    Eigentlich möchte ich ein Objekt, das im Endlos-Thread erstellt wurde vom "normalen" Thread aus bearbeiten. Ich weiß wie das grundsätzlich geht, aber nur vom Endlos-Thread auf den "Normal"-Thread.

    Vielen Dank schon im Voraus


    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10


    • Bearbeitet Bolzen Donnerstag, 4. Juli 2013 18:38 Ergänzung
    Donnerstag, 4. Juli 2013 18:36

Antworten

  • Danke für die Antworten. Ich habe an der Softwarearchitektur meines Programms ein wenig gefeilt, sodass ich das Problem sowieso nicht mehr habe. Trotzdem vielen Dank!

    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10

    • Als Antwort markiert Bolzen Samstag, 13. Juli 2013 07:40
    Samstag, 13. Juli 2013 07:39

Alle Antworten

  • Hallo, man kann problemlos auf die Objekte aus dem anderen Thread zugreifen, eine Ausnahme bilden beispielsweise die Steuerelemente. Wie genau meinst du denn das mit der Endlosschleide im 2. Thread? Sowas hier:
    while(true)
    {
       Thread.Sleep(100);
    }
    Dann bringt dir das Teil (fast) nichts. Solange wie beide Threads syntaktisch auf das Objekt zugreifen können, sollte es in den meisten Fällen gehen. Mal so ein fiktives (,sinnloses) Beispiel:
    Imports System.Threading

    Module Module1
        Dim rnd As Random = Nothing
        Dim d As Double = 0
        Dim t As Thread
        Sub Main(args As String())
            t = New Thread(New ParameterizedThreadStart(Sub(obj)
                                                            While True 'In Dauerschleife probieren.
                                                                If rnd IsNot Nothing Then
                                                                    d = rnd.NextDouble() 'Erst berechnen, wenn Das Random-Objekt erstell wurde
                                                                End If
                                                                Thread.Sleep(100)
                                                            End While
                                                        End Sub))
            t.Start()'2. Thread starten
            Thread.Sleep(1000)'warten bis 2. Thread ganz sicher läuft
            rnd = New Random()'Random initialisieren
            While True'In Dauerschleife probieren.
                If d <> 0 Then
                    Debugger.Break()'Anhalten, wenn ein Zufallswert generiert wurde
                End If
            End While 'Der 1. Thread erstellt das Random-Objekt, der 2. Thread benutzt dieses.
        End Sub
    End Module
    Der Code ist entsprechend kommentiert. Ein Dispatcher wird nicht benötigt.


    - Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    ; Webseite | Code Beispiele | Facebook | Snippets | Twitter
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Donnerstag, 4. Juli 2013 21:30
  • Hallo, man kann problemlos auf die Objekte aus dem anderen Thread zugreifen, eine Ausnahme bilden beispielsweise die Steuerelemente.
    Uhm, das ist ja irgendwie dumm. Das Objekt erbt nämlich von der Klasse Panel (ist also ein Steuerelement). Gibt da einen Ausweg?

    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10


    • Bearbeitet Bolzen Sonntag, 7. Juli 2013 15:00 Ergänzung
    Sonntag, 7. Juli 2013 14:57
  • Hallo Bolzen,

    Du kannst das Panel schon anpassen, darfst nur nicht direkt aus dem anderen Thread darauf zugreifen. Nur von dem Thread, auf dem das Panel erstellt wurde. Aus anderen Threads übergibst Du die "Arbeit" an den Dispatcher, der diese "Arbeit" für Dich dann auf dem Panel-Thread ausführt. Den richtigen Dispatcher findest Du in der Dispatcher-Property des Panels. Ruf darauf die BeginInvoke-Methode auf. Hier findest Du einen Startpunkt:

    http://social.msdn.microsoft.com/Forums/vstudio/en-US/b7804801-f970-4708-8e56-1c7aab4c7387/dispatcherbegininvoke


    Thomas Claudius Huber Twitter: @thomasclaudiush Homepage: www.thomasclaudiushuber.com Author of the ultimate Windows Store Apps handbook Author of the ultimate WPF handbook Author of the ultimate Silverlight handbook

    Montag, 8. Juli 2013 12:48
  • Hallo Thomas,

    das ist ja mein Problem: Mit einem Dispatcher kann ich nicht darauf zugreifen, da sonst ebenfalls eine Endlosschleife im Haupt-Thread entsteht (wegen des Dispatchers).


    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10

    Montag, 8. Juli 2013 12:54
  • Durch den Dispatcher wird der übergebene Code im Hauptthread ausgeführt. Wenn du also nur den Zugriff auf das Panel im Dispatcher machst und die Schleife selbst im 2. Thread laufen lässt, dann sollte es funktionieren. Als Pseudocode so hier:

    Schleife
        Dispatcher - Start
            Zugriff auf das Panel
        Dispatcher - Ende
    Schleife - Nächster durchgang

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Montag, 8. Juli 2013 12:56
  • Danke für die Antworten. Ich habe an der Softwarearchitektur meines Programms ein wenig gefeilt, sodass ich das Problem sowieso nicht mehr habe. Trotzdem vielen Dank!

    Gruß, Bolzen PS: Ich programmiere mit VS12(Desktop) und VS10

    • Als Antwort markiert Bolzen Samstag, 13. Juli 2013 07:40
    Samstag, 13. Juli 2013 07:39