Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0434: Threadsafe Control

 von 

Hinweis zum Tippvorschlag  

Dieser Vorschlag wurde noch nicht auf Sinn und Inhalt überprüft und die Zip-Datei wurde noch nicht auf schädlichen Inhalt hin untersucht.
Bitte haben Sie ein wenig Geduld, bis die Freigabe erfolgt.

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Steuerelemente

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Thread,Control,Delegate

Der Vorschlag wurde erstellt am: 28.06.2012 14:02.
Die letzte Aktualisierung erfolgte am 28.06.2012 14:30.

Zurück zur Übersicht

Beschreibung  

Dieser Tipp zeigt, wie man ohne Delegates auf Controls von einem anderen Thread aus zugreift.

Es wird ein neues Control erzeugt, welches von dem enstprechenden Control erbt. Hier wird die Text Property überschrieben und der Zugriff gesteuert.

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [15,60 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' -------- Anfang Projektgruppe ThreadSafeControl.sln --------
' ------------ Anfang Projektdatei Projekt.vbproj ------------
' ------------------ Anfang Datei Form1.vb  ------------------
Imports System.Threading

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        ' Zugriff aus selben Thread

        Me.ThreadSafeTextbox1.Text = "Hallo Activevb.de vom selben Thread"

    End Sub

    Private Sub AnotherThread()

        Me.ThreadSafeTextbox1.Text = "Hallo Activevb.de von einem anderen Thread"

    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

        ' Thread erzeugen
        Dim thread1 As New Thread(AddressOf AnotherThread)

        ' Thread starten
        thread1.Start()

    End Sub

End Class

' ------------------- Ende Datei Form1.vb  -------------------
' ------------ Anfang Datei ThreadSafeTextbox.vb  ------------
Public Class ThreadSafeTextbox

    Inherits TextBox

    ' Überschreiben der Basis-Eigenschaft
    Public Overrides Property Text As String
        Get
            Return MyBase.Text

        End Get

        Set(value As String)

            ' Abfragen, ob ein Invoken erforderlich ist
            If MyBase.InvokeRequired Then

                ' Den zu setzenden Text per Invoke übergeben
                MyBase.Invoke(Sub(s As String) MyBase.Text = s, New Object() {value})

                ' Messagebox, um festzustellen, aus welchem Thread aus zugegriffen wurde

                ' Abfragen, ob man sich im Designmode befindet, obwohl zu Designtime wohl
                ' nie aus einem anderen Thread zugegriffen wird
                If Not DesignMode Then
                    MessageBox.Show("Zugriff aus ANDEREM Thread")
                End If

            Else

                ' Den zu setztenden Text normal übergeben
                MyBase.Text = value

                ' Abfragen, ob man sich im Designmode befindet
                If Not DesignMode Then
                    MessageBox.Show("Zugriff aus SELBEN Thread")
                End If
            End If

        End Set

    End Property

End Class

' ------------- Ende Datei ThreadSafeTextbox.vb  -------------
' ------------- Ende Projektdatei Projekt.vbproj -------------
' --------- Ende Projektgruppe ThreadSafeControl.sln ---------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.