Autor Beitrag
avoid
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden 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
    {
        // wenn daten empfangen werden
        empfang = serialPort1.ReadExisting();
        textBox_raw.AppendText(empfang);
    }
    catch
    {
        // wenn keine daten empfangen werden
    }
}


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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
this.BeginInvoke(() => textBox_raw.AppendText(empfang));					

oder
ausblenden C#-Quelltext
1:
this.BeginInvoke(() => UpdateGUI(empfang));					

wenn es etwas mehr wird.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: schönere Formatierung des C#-Codes
avoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
this.BeginInvoke(UpdateGUI());					

Würde zunächst die Methode UpdateGUI() ausführen und das Ergebnis dann der Methode BeginInvoke übergeben.
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
this.BeginInvoke((Action)delegate() { textBox_raw.AppendText("blub"); });					
avoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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