Form1.RichtextBox von anderer Klasse ansprechen

flotschie

Mitglied
hi,

ich hab eine Windows-Form (Form1) mit einer Richtextbox drauf, und eine Prozedur in einer anderen Klasse.

Diese Prozedur wird vom Code der Form1 aufgerufen und soll etwas in die Richtextbox der Form1 schreiben.

Wie mache ich das? Mein Ansatz ist folgender:

Aufruf der Prozedur 'test' der Klasse 'Order' von Form1 aus:
Code:
Private Sub Start_test()

Order.test(Me)

End Sub

In der Prozedur 'test' steht dan folgendes:

Code:
Public Shared Sub test(ByVal formi As Form1)

formi.RichTextBox1.AppendText("Hallo")

End Sub

Ist das generell richtig so? Funktionieren tuts nämlich. Aber es kommt noch was erschwerendes dazu:

Die Prozedur "test" kann als thread vielfach gleichzeitig aufgerufen werden. Muss man wie bie globalen Variablen hier auch den Zugriff auf die Windows-Controls synchronisieren, und wenn ja, wie geht das?
 
Nach längerem Recherchieren hab ich jetzt in der MSDN das hier gefunden wenns wer braucht!:

Um rechenintensive Prozeduren von Klassenmodulen auszuführen, eignet sich am besten das Multithreadingverfahren. Im Unterschied zu anderen Komponenten können Probleme auftreten, wenn Methoden in Steuerelementen aus verschiedenen Threads aufgerufen werden. Methoden, die sich auf Steuerelemente auswirken, sollten nur auf dem Thread ausgeführt werden, auf dem das Steuerelement erstellt wurde. Da Systemressourcen stark beansprucht werden, wenn Aufrufe von einem Thread aus gemarshallt und über die Threadgrenzen hinaus an einen anderen Thread gesendet werden, sollten Sie es vermeiden, Steuerelemente auf anderen Threads wiederholt aufzurufen. Im günstigsten Fall sind direkte Aufrufe aus anderen Threads ressourcenintensiv, was sich negativ auf die Verarbeitungsgeschwindigkeit der Anwendung auswirkt. Im ungünstigsten Fall können Bedingungen eintreten, die ein Deadlock in der Anwendung verursachen und die Ausführung einfrieren.
In bestimmten Situationen kann es sich jedoch ergeben, dass Sie Methoden in Steuerelementen von anderen Threads aus aufrufen möchten. Beispielsweise könnten Sie als Reaktion auf eine Aktion, die von einem Thread ausgeführt wurde, eine Methode aufrufen, die eine Schaltfläche deaktiviert oder eine Anzeige in einem Formular aktualisiert. .NET Framework stellt Methoden bereit, die von jedem beliebigen Thread aus ohne Sicherheitsrisiko aufgerufen werden können und die ihrerseits Methoden aufrufen, die mit Steuerelementen anderer Threads interagieren. Die Control.Invoke-Methode ermöglicht die synchrone Ausführung von Methoden für Steuerelemente, während die Control.BeginInvoke-Methode die asynchrone Ausführung startet. Um diese Methoden zu verwenden, müssen Sie einen Delegaten deklarieren, der dieselbe Signatur wie die aufzurufende Methode besitzt. Anschließend können Sie die Invoke-Methode oder die BeginInvoke-Methode jedes im Formular enthaltenen Steuerelements aufrufen, indem Sie den entsprechenden Delegaten zur aufzurufenden Methode angeben. Alle erforderlichen Parameter werden in ein Object eingeschlossen und an die Methode übermittelt.
So rufen Sie Methoden mit Steuerelementen auf, die anderen Threads zugehörig sind
Deklarieren Sie einen Delegaten mit einer Signatur, die mit derjenigen der aufzurufenden Methode identisch ist.
Im folgenden Beispiel wird gezeigt, wie ein Delegat mit den Parametern Integer und String deklariert wird.
' Visual Basic
Public Delegate Sub myDelegate(ByVal anInteger as Integer, ByVal _
aString as String)

// C#
public delegate void myDelegate(int anInteger, string aString);
Verwenden Sie ein beliebiges Steuerelement, um Methoden aufzurufen, die anderen Threads zugehörige Steuerelemente bearbeiten.
Hinweis Falls die Methode Parameter benötigt, können diese in einem Object bereitgestellt werden.
Wenn Sie Methoden synchron aufrufen möchten, rufen Sie die Control.Invoke-Methode auf.
' Visual Basic
Label1.Invoke(New myDelegate(AddressOf myMethod), New _
Object() {1, "This is the string"})

// C#
Label1.Invoke(new myDelegate(myMethod), new Object[] {1,
"This is the string"});
Wenn Sie Methoden asynchron aufrufen möchten, rufen Sie die Control.BeginInvoke-Methode auf.
' Visual Basic
Label1.BeginInvoke(New myDelegate(AddressOf myMethod), _
New Object() {1, "This is the string"})

// C#
Label1.BeginInvoke(new myDelegate(myMethod), new
Object[] {1, "This is the string"});
 

Neue Beiträge

Zurück