Autor |
Beitrag |
avoid
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Mo 24.08.15 21:56
Ich bastele mir gerade mal wieder ein kleines Tool in VC#2010 und wundere mich grün und blau.
Hier erst mal der Code:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string empfang = null; try { empfang = serialPort1.ReadExisting(); textBox_raw.AppendText(empfang); } catch { } } |
wenn ich den Code im Debug des VisualStudio laufen lasse wird nichts an die TextBox übergeben, weil der zugriff auf die TextBox aus dem Ereignis nicht geht.
Threat übergreifendes bla bla bla eben.
Starte ich die Kompilierte exe unter win7 oder win8 läuft es komischerweise ohne zicken und zeigt auch brav an was rein kommt.
Kann mir wer erklären warum das so ist und wie ich den Debug dazu bekomme nicht so rum zu zicken?
gruß,
avoid
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mo 24.08.15 22:14
Wenn das mit der kompilierten exe läuft, ist das eher Glück - also besser gleich richtig machen
Du solltest die GUI-Operation in eine eigene Methode auslagern und diese dann per Invoke() oder BeginInvoke() aufrufen. Anregungen gibt's z.B. hier: www.entwickler-ecke....ur+GUI_110912,0.html
oder hier: www.entwickler-ecke....lweise_100598,0.html
BeginInvoke() ist eine Methode des Formulars und führt die übergebene Methode im Kontext des Formulars aus. Du schreibst also sowas wie
C#-Quelltext 1:
| this.BeginInvoke(() => textBox_raw.AppendText(empfang)); |
oder
C#-Quelltext 1:
| this.BeginInvoke(() => UpdateGUI(empfang)); |
wenn es etwas mehr wird.
Moderiert von Th69: C#-Tags hinzugefügt
Moderiert von Th69: schönere Formatierung des C#-Codes
|
|
avoid
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Di 25.08.15 20:12
ich verstehe was du meinst aber selbst nach lesen deiner links und der MSDN Seite zu dem befehlt, verstehe ich nicht was ich in den vorderen teil als Delegate eintragen muss.
liegt wohl daran das mir Delegate nix sagt.
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 25.08.15 20:36
Also ein Delegate könnte man auch als Callback oder Funktionszeiger beschreiben. Es gibt immer einen Delegat-Typen der eine Methodensignatur beschreibt (Parameter, Rückgabewert) und die Methoden eines Objekts, die auf diesen Delegat-Typ "passen".
Hier gibt es die BeginInvoke Methode des Formulars. Diese führt Code im Threadkontext des Formulars aus. Alleine ist das aber witzlos, die muss ja wissen WELCHEN Code sie ausführen soll. Deshalb übergibt man dem BeginINvoke wiederum eine Methode, die dann ausgeführt wird.
Vergleich:
C#-Quelltext 1:
| this.BeginInvoke(UpdateGUI()); |
Würde zunächst die Methode UpdateGUI() ausführen und das Ergebnis dann der Methode BeginInvoke übergeben.
C#-Quelltext 1:
| this.BeginInvoke(UpdateGUI); |
Jedoch ruft nur BeginInvoke auf. Was BeginInvoke dann mit der Methode UpdateGUI macht, kann man erst mal nicht sagen. (Logisch betrachtet wird sie aber irgendwann ausgeführt, sonst wäre das übergeben eines Delegates witzlos)
Da der Delegat-Typ jetzt noch nicht ganz passt, wird eine anonyme Methode erzeugt. Syntax: () => { ... } Und diese dann auf den Typ Action gecastet.
C#-Quelltext 1: 2: 3: 4:
| this.BeginInvoke((Action)(() => { textBox_raw.AppendText(empfang); })); |
Innerhalb der anonymen Methode kannst du dann machen was du willst.
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 25.08.15 21:30
Zitat: | Da der Delegat-Typ jetzt noch nicht ganz passt, wird eine anonyme Methode erzeugt. |
Um mal kurz den Klugscheißer rauszuholen obwohl es natürlich logisch identisch ist nur syntaktisch ganz leicht anders, das ist ein Lambdaausdruck keine anonyme Methode.
Anonyme Methode sähe so aus.
C#-Quelltext 1:
| this.BeginInvoke((Action)delegate() { textBox_raw.AppendText("blub"); }); |
|
|
avoid
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Mi 26.08.15 20:29
a ha!
Action ist ein Typ (quasi ein Delegate Typ) und kein Platzhalter für irgend etwas anderes.
Na das macht es doch schon verständlicher.
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
|