Imam problem gdje mi se event handler ne poziva tada kada meni treba.
Program salje komande u uredjaj. Nakon svake komande sljedi odgovori. Taj odgovor moze biti razlicit i na osnovu tog odgovora moram tako i reagovati (greska? nema struje? blokirao uredja? itd..).
Imam sljedecu strukturu:
Handleri:
Kao i odgovarajuce metode (navodim samo jednu metodu radi prostora):
void fCom_OnIncomingData(object sender, fCommunicationEventArgs e)
{
if (checkBox_Batch.Checked == false)
{
this.textBox_receive.Text = fCom.CommunicationTools.ByteArrayToHexString(e.ReceiveMessageByte); //using the helper class for converting the incoming data to hex string
}
else
{
string line = "Receive: " + fCom.CommunicationTools.ByteArrayToHexString(e.ReceiveMessageByte) + "\n";
this.richTextBox_Log.AppendText(line);
incomingData.dataString = e.ReceiveMessageString;
incomingData.dataByte = e.ReceiveMessageByte;
}
}
I na kraju while koji ceka odgovor.
incomingData.dataString = string.Empty; //isprazni podatke tako da novi stignu
...
while (incomingData.dataString == string.Empty) //sve dok nema odgovora cekaj dok ne dodje
{
// ovo se vrti sve dok ne stigne odgovor iz uredjaja
Thread.Sleep(10); //Pricekaj malo dok ne stigne odgovor
}
// dalje sljedi if-else struktura
Ovo savrseno radi, kada je standalone, hocu reci kada je u malom programu koji to testira. Problem nastaje kada ovo implementiram u vec gotovu aplikaciju. Onaj event handler koji puni string, se nikada ne zove i shodno tome while se zauvijek vrti u petlji.
Da mijenjam aplikaciju nije opcija, jer je vec ogromna.
Nasao sam dirty fix, koji rijesava problem sa event handlerom i nejgovim pozivom, ali onda kopletan sistem je sporiji za cirka 50%. Zato sto se sve uspori zbog pozivanja messagebox-a.
Ako recimo u while stavim ovo (oboje radi):
MessageBoxEx.Show("JAVI SE", 0) ili MessageBox.Show("JAVI SE")
dakle:
while (incomingData.dataString == string.Empty) //sve dok nema odgovora cekaj dok ne dodje
{
// ovo se vrti sve dok ne stigne odgovor iz uredjaja
MessageBoxEx.Show("JAVI SE", 0); //Obican message box, koji se automatski gasi. INT odredjue vrijeme gasenja u ms.
Thread.Sleep(10); //Pricekaj malo dok ne stigne odgovor
[/code]
Onda se event handler aktivira i obavi svoj posao. Zbog nekog razloga, jednom kada udje u while loop nikada ne izlazi iz njega, sve dok ne napravim "break" sa messagebox trikom.
Kako mogu eksplicitno da zovnem handler u ovom mom slucaju?
[IMG]http://img233.imageshack.us/img233/5078/thumbnailte1.th.jpg[/IMG]
They say I look like daddy :D