BeginInvoke wordt niet gestart

  • Onderwerp starter Onderwerp starter DMK
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

DMK

Gebruiker
Lid geworden
5 nov 2013
Berichten
31
Hallo,

Ik heb een classe: Meetinstrument. (hierin maakt hij een Seriële verbinding.)

In het form (UserInterface) heb ik een methode (_serialPort_DataReceived) welke aangeroepen wordt als ik data binnen krijg. Dit werkt.

Zie code:
Code:
 internal void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            RxString = MeetInstrument._serialPort.ReadExisting();
            if (!this.IsHandleCreated)
            {
                this.CreateHandle();
            }
            if (this.IsHandleCreated)
            {
                BeginInvoke(new EventHandler(DisplayText));
            }
        }

        private void DisplayText(object sender, EventArgs e)

BeginInvoke(new EventHandler(DisplayText));
Via bovenstaande code maak ik een nieuwe eventhandler aan. Het probleem is dat deze niet aangeroepen wordt

Code: DisplayText():
Code:
private void DisplayText(object sender, EventArgs e)
{
     //Code
}

Ik heb dit allemaal geprobeerd in het form en dan werkt het, nu heb ik het gekopieerd naar een solution met meerdere classen (meetInstrument, UserInterface...) en nu werkt het niet meer. De methode DisplayText wordt gewoon niet aangeroepen.

Doe ik iets verkeerd?
Bedankt
 
Je kunt gewoon de method aanroepen toch? Zonder dit handle gedoe

Of de code in de serialPort_DataReceived uitvoeren en gebruik maken van de eventargs e die je krijgt.
 
Aangezien ik met meerdere threads werk icm het tekenen van objecten werkt dat ook niet:

Code:
Graphics g = System.Drawing.Graphics.FromHwnd(Pie.Handle);

Foutmelding:
Cross-thread operation not valid: Control 'Pie' accessed from a thread other than the thread it was created on.
 
Heb je al gewoon 'Invoke(new EventHandler(DisplayText));' geprobeerd inplaats van begin invoke? (dan moet je ook wel end invoke aanroepen neem ik aan ;) )



Zo kan het bijvoorbeeld bij een textbox
[CPP]if (textBox1.InvokeRequired)
{
textBox1.Invoke(new Action<object,EventArgs>(DisplayText), new object[] {sender,e});
}
else
{
textBox1.Text = sender.ToString(); //? of wat dan ook
}[/CPP]
 
Bedankt, met Invoke (ipv BeginInvoke) wordt de methode wel aangeroepen, maar ik krijg het nog niet echt werkend.

Dit is mijn MeetInstrument.cs code:

Code:
private readonly UserInterface _mainView;

public MeetInstrument(UserInterface mainView)
{
     _mainView = mainView;
     _serialPort = new SerialPort();
     _serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(_mainView._serialPort_DataReceived);

     //Instellingen en _serialPort.Open();
}

In mijn UserInterface heb ik de _serialPort_DataReceived methode
Code:
internal void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
     RxString = MeetInstrument._serialPort.ReadExisting();
     if (!this.IsHandleCreated)
     {
          this.CreateHandle();
     }
     if (this.IsHandleCreated)
     {
          Invoke(new EventHandler(DisplayText));
     }
}

De DisplayText methode werkt hiermee verder.
Het probleem is nu dat de _serialPort_DataReceived methode maar een paar keer wordt aangeroepen en daarna stopt...
waar ligt het probleem?

Bedankt!

Edit:
Ik zie de eerste keer dat _seriaPort_DataReceived wordt aangeroepen de Thread: <No Name> is, en de 2e keer Thread: Worker Thread...

Dan stopt hij, of per toeval geeft hij de foutcode: An error occurred invoking the method. The destination thread no longer exists.
 
Laatst bewerkt:
Je kunt ook gewoon een method in plaats van het hele form doorgeven:

[CPP]public class MeetInstrument
{
private readonly SerialPort _serialPort;

public MeetInstrument(SerialDataReceivedEventHandler handler)
{
_serialPort = new SerialPort();
_serialPort.DataReceived += handler;

//settings
_serialPort.Open();
}

public SerialPort Port
{
get { return _serialPort; }
}
}[/CPP]

en dan zou dit toch moeten werken denk ik, kan het niet testen
[CPP]public partial class Form1 : Form
{
private MeetInstrument _measure;

public Form1()
{
InitializeComponent();
_measure = new MeetInstrument(SerialDataReceived);
}

private void SerialDataReceived(object sender, SerialDataReceivedEventArgs e)
{
var serialPort = (SerialPort) sender;
var existingData = serialPort.ReadExisting(); //of _measure.Port.ReadExisting();

DisplayData(existingData);
}

private void DisplayData(string data)
{
if (txtData.InvokeRequired)
{
txtData.Invoke(new Action(() => DisplayData(data)));
}
else
{
txtData.Text = data;
}
}
}[/CPP]


(in dit voorbeeld Close/Dispose ik de port niet, maar zou je in je eigen code wel moeten hebben)
 
Bedankt,

Alles werkt. Het enige rare probleem is dat als ik de balans (seriële communicatie) uitzet en weer aanzet hij stopt met het ontvangen van data.
Zet ik een breakpoint ergens (DisplayData of SerialDataReceived), dan komt hij daar gelijk en vanaf dat moment gaat hij weer door met het ontvangen van data...

Het lijkt alsof de breakpoint weer een trigger is om data te ontvangen.
Weet je toevallig waar dit aan kan liggen?

Als ik in de SerialDataReceived een messagebox zet, wordt die uitgevoerd als de balans aanstaat, stopt die als de balans uit gaat, en begint die weer als de balans aangezet wordt. (Met messagebox wordt ook de rest van de code weer uitgevoerd).

Verwijder ik de messagebox gaat hij niet vanzelf door??

Bedankt!
 
Laatst bewerkt:
Het is dat ik niets kan testen dus alleen maar even dingen kan zeggen waar ik naar zou kijken

ErrorReceived event
PinChanged event

misschien dat hier iets gebeurt als je de comm uitzet?

Heb hier ook nooit iets mee gedaan, fijn dat de basis in ieder geval werkt :P
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan