skorpionx schrieb:
> Ich schreibe unter Visual Studio 2017 ein Programm für
> Serielle Schnittstelle. Empfang funktioniert ohne Fehler
> wenn ich Daten in einen lokalen String schreibe. Ich versuche
> aber die Daten (für Visualisierung) in textBox zu schreiben.
> Aber das bringt den Fehler:
> „Ungültiger threadübergreifender Vorgang“
Die Ereignisse von SerialPort erfolgen nicht im Kontext des
Haupt-Threads des Programmes, der für das GUI zuständig ist. Deswegen
haben nahezu alle GUI-Komponenten eine eingebaute Warnung, denn das GUI
ist nicht threadfest, es würde also unkontrollierbare Scheisse
passieren, wenn es diese Warnung nicht gäbe.
Um zu erreichen, was du willst, mußt du (etwas vereinfacht) das Ereignis
des fremden Threads in den Kontext deines GUI-Threads zwingen. Dafür
bieten die allermeisten GUI-Komponenten (als Erben von Control)
freundlicherweise die passenden Methoden an, nämlich:
InvokeRequired
Invoke
BeginInvoke
Wenn du nach diesen Methoden googelst, wirst du sicher den Code
hunderter Anwendungsfälle finden.
Aber Vorsicht: Viele davon sind nicht ganz korrekt, was zu Problemen
(besonders beim Start oder beim Beenden der Anwendung) führen kann.
Schuld sind meiner Meinung nach daran aber nicht die Verfasser der
entsprechenden Code-Stellen, sondern allein Microsoft. Das Problem ist
nämlich, dass InvokeRequired NICHT tut, was man von einer Methode
dieses Namens erwarten könnte. Die hätte eigentlich heissen müssen:
InvokeRequiredAndPossible und müsste ein Ergebnis liefern, anhand dessen
man zwischen den drei relevanten Situationen unterscheiden kann...