Problem Zugriff auf ein TextBox-Steuerelement aus einer anderen Klasse/thread VB.NET
ich versuche, um Zugriff auf ein richtextbox-Steuerelement aus einer anderen Klasse und der thread wird dann die Benutzeroberfläche und ich kann nicht scheinen, um es funktioniert. Ich habe momentan den sub das ist Umgang mit der Arbeit innerhalb einer public-Klasse und Ihre ein sharedsub, ich gehe auf den Aufruf von mehreren verschiedenen Klassen und threads, aber wieder, ich kann nicht scheinen, um es arbeiten. der code sieht so aus.
Public Class SharedSubs
Public Shared Sub console(ByVal message As String)
Dim c As New Form1
If c.consoleBox.Text.Length > 0 Then
If c.consoleBox.Text.Substring(c.consoleBox.Text.Length - 3, 3) = "..." Then
c.consoleBox.AppendText(message)
ElseIf c.consoleBox.Text.Substring(c.consoleBox.Text.Length - 1, 1) = "." Then
c.consoleBox.AppendText(ControlChars.NewLine & timeStamp() & message)
End If
Else
c.consoleBox.AppendText(timeStamp() & message)
End If
End Sub
ich würde fordern sub mit SharedSubs.Console("stringstring")
wenn diese aufgerufen wird von dem ui-thread funktioniert es aber, wenn die genannte von anyother thread oder Klasse Ihre macht nix, ich habe bestätigt, es werde durch diesen code, aber nicht seine Darstellung, etwas in die textbox und nicht durch eine Ausnahme aufgrund Delegierten, was ich dachte, es würde.
Mache ich das komplett falsch? etwas Hilfe wäre Super, danke.
Du tust multi-threading falsch. Sie sollen nicht auf die Aktualisierung der Benutzeroberfläche in einem anderen thread. Wenn Sie unbedingt haben, um dies zu tun, müssen Sie die
Invoke
- Methode der Control
Klasse. Überprüfen Sie die Dokumentation für details. Es gibt viele andere, ähnliche Fragen hier auf Stack Overflow über multi-threading Probleme. Eine Suche, um zu finden einige Beispiel-code.InformationsquelleAutor tye | 2011-04-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Idealerweise verwenden Sie eine Veranstaltung, dann haben Sie andere Dinge an Ihrem Textupdate... Z.B. möchten Sie vielleicht, um es anzuzeigen, und melden Sie es ... dann müssen Sie nur das Formular binden und die Anmeldung zu der Veranstaltung.
Wenn Sie wirklich wollen, rufen Sie die Methode auf das Formular, dann müssen Sie rufen Sie es auf den richtigen thread. Diese kann getan werden 2 Arten.
In der Klasse, wo Sie erstellen den Thread übergeben Sie einen Verweis auf das Formular/Steuerelement in den Konstruktor (und daher auf dem gleichen thread an dieser Stelle). Speichern Sie die Referenz in Ihrer Klasse. Dann erstellen Sie Ihre Thread. (Verwenden Sie nicht den gemeinsamen, so dass Sie auf die richtige Instanz)
In deinem Thread, die du dann nur das Formular Aufrufen.
ODER
Aus deinem thread, Rufen Sie die Methode auf das Formular, und innerhalb der Methode auf das Formular.
wo ich 'Tun, die eigentliche Arbeit hier werden Sie in Ihre .. c.consoleBox.AppendText(timeStamp() & message) etc
InformationsquelleAutor Paul Farry
Die Sie nicht ändern können, die Anzeige einer Winforms UI-Komponente aus einem anderen thread als dem Haupt/UI-thread. Aktualisieren von einem anderen thread, check-out Kontrolle.Aufrufen der Dokumentation. Es hat ein schönes Beispiel.
http://msdn.microsoft.com/en-us/library/zyzhdc6b%28v=VS.100%29.aspx
tye: ich weiß nicht, wie ein cross-class-Problem könnte sogar vorhanden sein. Machen würde OOP ziemlich nutzlos. 😀 Haben Sie versucht, die Kontrolle.Invoke-Methode noch?
ich habe es noch nicht versucht. dies scheint wie etwas, das ziemlich einfach ist, im aufregen, das gibt mir eine harte Zeit.
InformationsquelleAutor realistschuckle
Versuchen Sie, diesen code in die form load:
Me.CheckForIllegalCrossThreadCalls = False
Sollte es das problem beheben
Besser?
Ja. Aber es nicht sagen, wie dieses problem behebt. Auch das klingt wie könnte es schädlich sein, um
False
.Ich Frage geantwortet, tut mir Leid, wenn du es nicht magst 🙂
Threads, die nicht interagieren mit dem Formular, gleich wie der backgroundworker-Klasse.
InformationsquelleAutor Stefan Đorđević