-
Dann wirst du wohl nicht darum kommen dir anzuschaun was das mit den Delegaten auf sich hat, da du ja Daten übergeben möchtest.
Die Variante mit der globalen Variable ist allerdings wesentlich einfacher:
Code:
string Daten = "";
void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Daten = serialPort.ReadLine();
lbRecieved.Invoke(new MethodInvoker(MethodeZumDatenInListboxSchreiben));
}
void MethodeZumDatenInListboxSchreiben()
{
lbRecieved.Items.Add(Daten);
}
-
schon mal danke dafür
würds halt gern über delegate machen... wie gesagt habe wirklich gestern 12std fast am stück versucht das zu verstehen
im internet ist jeder code anders und ich sehe nie einen zusammenhang
deswegen meine hoffung das du zu meinen code einen passenden befehl eben schnell schreiben kannst...oder ist das schon so viel
wills ja gern selber machen, aber grad komm ich einfach nicht vorran :(
-
Hast du auch schon in der MSDN unter delegate geschaut ? Ist zwar recht viel aber auch verständlich.
http://msdn.microsoft.com/de-de/libr...(v=vs.80).aspx
Warum übernimmst für den Threadübergreifendenzugriff eigentlich nicht den Code aus meiner Beispielanwendung? Da hab ich ja auch einen Delegaten verwendet
-
das hat ich auch schon gelesen
ja un deinen code ausm terminal hatte ich auch versucht...
sind ja halt mehrere teile..und es passt alles irgendwie nciht zsm... habs versucht anzupassen aber klappt einfach nicht,
weil ich wohl das prinzip von dem delegate und invoke befehl nich versteh -.-
-
Der Delegate ist quasi ein Zeiger auf eine Methode. Und den kann man halt einer anderen Methode übergeben. Der Invoke Befehle sagt dem GUI Objekt (in dem Fall eine Listbox): He ich will auf dich aus einem anderen Thread zugreifen.
In meiner Beispielanwendung hab ich den delegaten zuerst deklariert:
Code:
delegate void InvokeLB(string Data);
Und dann ein Objekt davon deklariert
Code:
InvokeLB lbRecievedDelegate;
Und dann in der Methode bCreateSP_Click eine neue Instanz erzeugt:
Code:
lbRecievedDelegate = new InvokeLB(InvokeLBRecieved);
Die auf diese Methode hier verweist
Code:
void InvokeLBRecieved(string Data) //Parameter stimmen mit der Deklaration des Delegaten überein
{
lbRecieved.Items.Add(Data);
}
Und in der Methode die Aufgerufen wird wenn neue Daten am SerialPort verfügbar sind rufe ich dann die Invoke Methode der Listbox lbRecieved auf und übergebe ihr den davor instanzierten Delegaten und die Parameter (in dem Fall die Daten die Empfangen wurden)
Code:
lbRecieved.Invoke(lbRecievedDelegate,new object[]{RecievedLine});
-
ich danke dir das du mir hilfst... habs grad versucht..
lbRecieved und RecievedLine ist im aktuellen Kontex nicht vorhanden
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports; //serielleSchnittstelle
using System.Collections; //ArrayListe
using System.Threading; //Delagation invoke (Threadübergreifend)
using System.Timers; //Timer
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
delegate void InvokeLB(string Data); //Delegaten deklariert
InvokeLB lbRecievedDelegate; //Objekt deklariert
SerialPort Schnittstelle = new SerialPort("COM1"); //Deklaration
byte[] daten = new byte [3];
private void Form1_Load(object sender, EventArgs e)
{
}
private void buttonConnect_Click(object sender, EventArgs e)
{ //Festlegung Parameter=
Schnittstelle.BaudRate = 9600;
Schnittstelle.Parity = Parity.None;
Schnittstelle.DataBits = 8;
Schnittstelle.StopBits = StopBits.One;
Schnittstelle.Handshake = Handshake.None;
Schnittstelle.ReadTimeout = 500;
Schnittstelle.WriteTimeout = 500;
try
{
Schnittstelle.Open(); //Serialport öffnen
if (Schnittstelle.IsOpen)
{
buttonConnect.Enabled = false; //Connect_Button blass
buttonConnect.Text = "Erfolgreich";
}
}
catch
{
MessageBox.Show("Keine Verbindung möglich", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
lbRecievedDelegate = new InvokeLB(InvokeLBRecieved); //neue Instanz
Schnittstelle.DataReceived += new SerialDataReceivedEventHandler(Nebenthread); // Abo_Event abonnieren
}
void InvokeLBRecieved(string Data) //Parameter stimmen mit der Deklaration des Delegaten überein
{
lbRecieved.Items.Add(Data);
}
void Nebenthread(object sender, SerialDataReceivedEventArgs e) //Diese Methode wird ausgelöst. Wurde vorher abonniert
{
//string serialIn = Schnittstelle.ReadLine();
//listBox1.Invoke(new EventHandler(delegate { listBox1.Items.Add(serialIn); }));
lbRecieved.Invoke(lbRecievedDelegate,new object[]{RecievedLine});
//this.textBox1.Text = Schnittstelle.ReadExisting();
}
private void buttonDisconnect_Click(object sender, EventArgs e)
{
Schnittstelle.Close();
buttonConnect.Enabled = true;
buttonConnect.Text = "Connect";
}
private void buttonSenden_Click(object sender, EventArgs e)
{
daten[0] = 1;
daten[1] = 2;
if (Schnittstelle.IsOpen)
{
Schnittstelle.Write(daten, 0, daten.Length); //Daten senden
// oder//Schnittstelle.Write(daten, 0, 2);
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e) // Anwendungen schließen = Verbindung trennen
{
Schnittstelle.Close();
}
}
}
ich merke grad wie sehr ich anfänger bin... diese invoke und delegate..methoden..threads... überfordert mich total
dabei wollte ich heut endlich daten empfangen -.-
-
achso... deine lbrecieved war ja deine listbox.. SRY .. so nun noch RecievedLine zuordnen .. :)
-
Text = Schnittstelle.ReadLine();
listBox1.Invoke(lbRecievedDelegate,new object[]{Text});
hab ich nun so gelöst..wenn ichs programm ausführe
kam zuerst ein timeout,hab ich denn rausgenommen
nun hängt sich das programm auf und es kommt folgende meldung:
Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen
oh man.. hab nur mit anderen terminal gesendet
kommt bei mir wieder das:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Form1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
-.-
-
Die String Variable RecievedLine deklarierst du in der SerialPortDataRecieved Methode (Bei dir Nebenthread) Die Methode würde dann so aussehen:
Code:
void Nebenthread(object sender, SerialDataReceivedEventArgs e) //Diese Methode wird ausgelöst. Wurde vorher abonniert
{
string RecievedLine = serialPort.ReadLine();
lbRecieved.Invoke(lbRecievedDelegate,new object[]{RecievedLine});
}
Bitte verwende auch absofort die Code Tags und achte ein bisschen auf die Formatierung deines Quellcodes
-
aaah danke! es funktioniert !!
ich habe nur das STRING vergessen ;)
DANKE