Laden...

Eventübergreifende Datenweitergabe an andere Steuerelemente

Erstellt von manmashineman vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.732 Views
M
manmashineman Themenstarter:in
4 Beiträge seit 2006
vor 17 Jahren
Eventübergreifende Datenweitergabe an andere Steuerelemente

Guten Tag die Herren und natürlich Damen,

ich weiß dass das Thema etwas "komisch" klingen mag. Doch der Fehler den ich erhalte ist schwer zu erklären.

Allgemeines:
VS2005 C# ist die Sprache, .NET2.0

Zunächst zu dem, was ich mache. (Habe noch einiges Mehr, aber das was ich beschreibe ist der einfachste Fall, wann der Fehler auftritt)

Ganz grob (sehr vereinfacht):
Eine Klasse Empfängt Daten, die vom COMPort kommen.
System.IO.Ports.SerialPort ...

Das "DataReceived"-Event wird ausgelöst bei erhaltenen Daten.

Wenn ich nun Daten aus dem Port-auslesen will, kann ich diese z.b. auf die Konsole schreiben (alles kommt schön an!)
Wenn ich aber die Daten in eine Textbox auf einer Form schreiben will, kommt der Fehler:

"Ungültiger Threadübergreifender Vorgang: Der Zugriff auf das Steuerelement XXXX erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde"

Meine Frage nun... wieso denn bitte das??
habe das ganze auch wie gesagt sehr viel komplexer. Aber dieser Fehler tritt ja schon auf, wenn ich nur eine Klasse habe. eine einfache Form, mit nur einer Textbox.

In dieser Form wird der Port geöffnet. Das Event ist hier deklariert. Wieso kann aus diesem Event heraus nicht die textbox beschrieben werden????

Aus meiner sich ist das Event ja wie eine Methode (nur der Aufruf der Methode ist ja das besondere).

Wieso kann ich dann also daraus bitte die Textbox nicht beschreiben??

Mir kommt es v.a. so vor, als wäre es unter .NET1.1 noch nicht so gewesen. zumindest sind mir noch nie solche Probleme in früheren Projekten aufgetreten!!
Daher schreibe ich auch hier und hoffe, dass mir jemand helfen kann.

Wie bitte bekomme ich dies sonst hin?!?

Vielen Dank auf jeden Fall schonmal im Voraus!!


keep it real!

M
manmashineman Themenstarter:in
4 Beiträge seit 2006
vor 17 Jahren

Ok... Fehler gefunden...

Einfach unter den initializeComponents(); Methodenaufruf.
CheckForIllegalCrossThreadCalls = false; schreiben

*Neu in VS2005 😉

in diesem Sinne...

Huldigt der Objektorientiertheit!! 😁

Und immer schön den Anfängern helfen. Coded ihnen so viel wie möglich zusammen .

Man lernt nicht schneller, wenn man es selbst machen muss und es ewig nicht hinbekommt. Merkt euch das!! 😉


keep it real!

484 Beiträge seit 2006
vor 17 Jahren

Hallo und Willkommen.

Wenn Deine Klasse ein OnDataReceived Event bereitsstellt musst Du doch nur
innerhalb deiner Form einen Eventhandler zuweisen.

public static void Main()
{
        DeineKlasse foo = new DeineKlasse();
        foo.OnDataReceived += new DeineKlasse.DataReceivedEventHander(fooDataReReceived);
}

void fooDataReReceived(object sender, DataReceivedEventArgs e)
{
         TextBox.Text = e.Message;
}

Sehe Dir Delegates und Events doch nochmal genauer an.
z.B.: http://www.galileocomputing.de/openbook/visual_csharp/

Jörg

F
10.010 Beiträge seit 2004
vor 17 Jahren

@manmashineman:

Bitte nicht gleich anfangen, und alles Falsch machen was geht.

Deise Fehlermeldung hat schon seine Berechtigung, und das Ausschalten dieser
sollte man nur tun, wenn man wirklich weiss was man tut.

Hier im Forum gibt es eine FAQ, die genau zu dieser Fehlermeldung eine Antwort
parat hat.

476 Beiträge seit 2004
vor 17 Jahren

Hallo manmashinemann,

Original von manmashineman
Ok... Fehler gefunden...

Einfach unter den initializeComponents(); Methodenaufruf.
CheckForIllegalCrossThreadCalls = false; schreiben

*Neu in VS2005 😉

in diesem Sinne...

ich würde dir lieber empfehlen wie in der FAQ beschrieben auf die TextBox auf deiner Form zuzugreifen, sie läuft in einem anderen Thread als dein COMPort. Das war zwar in 1.1 auch schon so, wird aber erst seit dem 2.0 er Framework abgeprüft. Durch das abschalten dieser Prüfung wird deine Anwendung möglicherweise instabil und mag hier und da zu unerklärlichen Phänomenen führen.

-yellow

EDIT: Sorry... da war wohl jemand schneller.

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

4.221 Beiträge seit 2005
vor 17 Jahren

Alternativ kannst Du natürlich auch die Komponente welche den Komport kapselt so bauen:

Komponenten mit mehreren Threads

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
manmashineman Themenstarter:in
4 Beiträge seit 2006
vor 17 Jahren

Wunderbar, vielen Dank..

Die Funktion, bzw. der Fehler ist mir schon klar...
Aus verschiedenen Threads auf ein und dieselbe Ressource zugreifen / Sie beschreiben, dass es da zu inkonsistenzen kommen kann leuchtet mir ein.

Nur gibt es die Fehlermeldung wirklich erst seit VS05 bzw. .NET 2.0 daher hat michs kurz vom Hocker gerissen, was denn das soll 🤔

Nun denn, wundert mich, dass ich die anderen Threads zu dem Thema nicht gefunden hab. Naja...

vielen Dank dass ihr auch bei doppel fragen immer gerne helft!! 👍


keep it real!